2017.10.27 数学期望(手把手教你推期望) 解题报告

【题目描述】

n 个数字,每一个数字可能为 1 m 中的任意一个值,现在进行 (nk+1) 次选择,第一次选择 1 k 个数字,第二次选 2 k+1 个数字……现在给出每一个数值 1m 对应的一个函数 wx ,对于每一次选择,它的代价为k个数内最大的数 mx wmx ,求在k次选择后,代价和的期望值是多少

【输入格式】

第一行,三个整数n, m, k
第二行,m个整数表示wt�� , … , ������

【输出格式】

输出值期望对1000000007取模的值。

【样例输入】

2 2 2
1 2

【样例输出】

750000007

【解题报告】

NOIP模拟的一道题,感觉比较有意思。
首先我们来处理一个简单的问题

问题1:有n个数,每个数的范围在 1m 中随机取,问这 n 个数最大值的期望?
解法:最大值的期望?听起来很懵逼。。
我们把这个期望值记为 X(n) ,考虑枚举最大值分别为k的情况的概率 P(k) ,不难得出 P(k)=((k)n(k1)n)/(m)n
现在我们知道当每一个k值作为最大值的概率了,现在让我们回到期望的定义:离散型随机变量X的取值为 x1,x2,x3,x4... p1,p2,p3,p4... X 对应取值的概率,可理解为数据 f(xi) 出现的频率 ,则 E(x)=xipi
所以说我们很轻松的得出了 X(n)=(k=1,k<=m)kP(k)

问题2:有n个数,每个数的范围在 1m 中随机取,每个数值有一个代价 w(i) ,问这 n 个数最大值 mx w(mx) 期望?
解法:现在的问题比问题1多了一个 w(i) ,但是如果理解了期望的定义,看懂了问题1的思路。
所以我们很轻松地得出了 X(n)=(k=1,k<=m)w(k)P(k)

问题3:原问题。
这k个选择是互不影响的,所以说答案为:
X(n)=(k=1,k<=m)w(k)P(k)
ans=(nk+1)X(k)

代码如下:

#include
#include
#include
using namespace std;
#define mod 1000000007
#define N 510

int n,m,k,M=1;
int w[N],p[N];
int ans=0;

int mpow(int a,int b)
{
    int ans=1,base=a;
    while(b!=0)
    {
        if(b&1!=0) ans=1LL*ans*base%mod;
        base=1LL*base*base%mod;
        b>>=1;
    }
    return ans%mod;
}
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=m;++i) scanf("%d",&w[i]);
    for(int i=1;i<=m;++i) p[i]=mpow(i,k);
    int inv=mpow(p[m],mod-2);
    for(int i=1;i<=m;++i)
    {
        int tmp=1LL*w[i]*(p[i]-p[i-1]+mod)%mod*inv%mod;
        ans=(ans+tmp)%mod;
    }
    printf("%d\n",1LL*ans*(n-k+1)%mod);
    return 0;
}

你可能感兴趣的:(————数学————)