原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1309.html

题目传送门 - 51Nod1309

题意

长度为N的整数数组A,有Q个查询,每个查询包含一个数M,对A的所有不同排列,执行find函数(需用到查询中的M),你来计算find函数的返回值的和。由于结果很大,输出Mod 1000000007的结果。
 
void find(int permutation_A[], int M){
x = Length(permutation_A);
sum = 0;
for(i = 0; i < x; i++) {
if (permutation_A[i] <= M)
sum = sum + permutation_A[i];
else
break;
}
return sum;
}
 
 
 

题解

  我们首先考虑求答案的期望。

  由于期望具有线性性,所以我们可以对于每一个数字对答案的贡献分开考虑。

  显然,如果在一个排列中,如果当前数字产生贡献,当且仅当该数字不大于 m ,且所有大于 m 的数字都出现在它后面。那么,设大于等于 m 的数字有 k 个,假设当前数字不大于 m ,那么当前数字产生贡献的概率是 $\frac{1}{k+1}$ 。那么它对总期望的贡献就是 它的值 × 概率。我们只需要把所有不大于 m 的数对期望的贡献求和就可以得到总期望了。又由于,所有不大于 m 的数产生贡献的概率相同,所以我们可以前缀和处理一下,快速求得期望。

  所以最终答案就是期望 × 排列总数。

代码

 #include <bits/stdc++.h>
using namespace std;
const int N=50005,mod=1e9+7;
int n,q,a[N],Ha[N],p[N],hs;
int Fac[N];
int Pow(int x,int y){
int ans=1;
for (;y;y>>=1,x=1LL*x*x%mod)
if (y&1)
ans=1LL*ans*x%mod;
return ans;
}
int main(){
scanf("%d%d",&n,&q);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
for (int i=1;i<=n;i++)
Ha[i]=a[i];
hs=1;
for (int i=2;i<=n;i++)
if (Ha[i]!=Ha[i-1])
p[hs]=i-1,Ha[++hs]=Ha[i];
p[hs]=n;
for (int i=1;i<=n;i++)
a[i]=(a[i-1]+a[i])%mod;
Fac[0]=1;
for (int i=1;i<=n;i++)
Fac[i]=1LL*Fac[i-1]*i%mod;
int ans=Fac[n];
for (int i=1;i<=hs;i++)
ans=1LL*ans*Pow(Fac[p[i]-p[i-1]],mod-2)%mod;
while (q--){
int v;
scanf("%d",&v);
int x=upper_bound(Ha+1,Ha+hs+1,v)-Ha-1;
int now=1LL*ans*Pow(n-p[x]+1,mod-2)%mod*a[p[x]]%mod;
printf("%d\n",now);
}
return 0;
}

  

51Nod1309 Value of all Permutations 期望的更多相关文章

  1. Permutations II

    Given a collection of numbers that might contain duplicates, return all possible unique permutations ...

  2. [LeetCode] Permutations II 全排列之二

    Given a collection of numbers that might contain duplicates, return all possible unique permutations ...

  3. [LeetCode] Permutations 全排列

    Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the follow ...

  4. 【BZOJ-3143】游走 高斯消元 + 概率期望

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2264  Solved: 987[Submit][Status] ...

  5. bzoj1415[NOI2005]聪聪和可可-期望的线性性

    这道题之前我写过一个巨逗比的写法(传送门:http://www.cnblogs.com/liu-runda/p/6220381.html) 当时的原因是这道题可以抽象出和"绿豆蛙的归宿&qu ...

  6. hdu 4481 Time travel(高斯求期望)(转)

    (转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...

  7. 【BZOJ3036】绿豆蛙的归宿 概率与期望

    最水的概率期望,推荐算法合集之<浅析竞赛中一类数学期望问题的解决方法> #include <iostream> #include <cstdio> using na ...

  8. POJ2369 Permutations(置换的周期)

    链接:http://poj.org/problem?id=2369 Permutations Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...

  9. UVA&&POJ离散概率与数学期望入门练习[4]

    POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...

随机推荐

  1. Sq lServer触发器的使用

    创建表: CREATE TABLE [dbo].[GeneralRule]( [ID] [int] NOT NULL, ) NULL, [DeleteFlag] [int] NOT NULL ) CR ...

  2. python序列(列表,元组,字典)的增删改查

    列表 操作 列表 方法 示例 增加 list.append(obj) 增加元素到末尾 eg. >>> list1=['hello','world','how','are','you' ...

  3. 8)django-示例(url传递参数)

    url传递参数有两种,一个是通过普通分组方式,一个是通过带命名分组方式 1.传递方式 1)普通分组方式,传递参数顺序是严格的.如下例子 url(r'^detail-(\d+)-(\d+).html', ...

  4. 在XIB 或者 SB 上面 实现 半透明的背景上添加UILabel是文字不透明

    设透明背景的时候直接设置RGB值  然后设置Opacity即可

  5. oracle提高查询效率的34条方法

    注:本文来源:远方的守望者  <oracle提高查询效率的34条方法> oracle提高查询效率的34条方法 1.选择最有效率的表名顺序 (只在基于规则的优化器中有效): ORACLE的解 ...

  6. Oracle12c 性能优化攻略:攻略1-3: 匹配表类型与业务需求

    注:目录表 <Oracle12c 性能优化攻略:攻略目录表> 问题描述 你刚开始使用oracle数据库,并且学习了一些关于可用的各种表类型的知识.例如:可以在堆组织表.索引组织表等之间支出 ...

  7. Confluence 6 属性的一个示例

    下面是有关 Confluence 页面被调用的前几行的访问概述. [344ms] - /display/ds/Confluence+Overview [313ms] - SiteMesh: parse ...

  8. 分布式Dubbo快速入门

    目录 Dubbo入门 背景 zookeeper安装 发布Dubbo服务 Dubbo Admin管理 消费Dubbo服务 抽取与依赖版本管理 Dubbo入门 Editor:SimpleWu Dubbo是 ...

  9. 初始Ajax

    一.Ajax准备知识:json 说起json,我们大家都了解,就是python中的json模块,那么json模块具体是什么呢?那我们现在详细的来说明一下 1.json(Javascript  Obie ...

  10. Python基础之面向对象进阶一

    一.isinstance(obj,cls)和issubclass(sub,super) 1.isinstance(obj,cls)检查obj是否是类 cls 的对象 class A: pass obj ...