首页 > 代码库 > bzoj 1426:收集邮票 求平方的期望

bzoj 1426:收集邮票 求平方的期望

  显然如果收集了k天,ans=k*(k+1)/2=(k^2+k)/2.那么现在要求的就是这个东西的期望。

  设f[i]表示已有i张邮票,收集到n张的期望次数,g[i]表示已有i张邮票,收集到n张的次数的平方的期望。

  显然i这个点有 $\frac{i}{n}$ 的概率走自环,有 $\frac{n-i}{n}$ 的概率走到i+1这个点。

  SO $$f[i]=(\frac{i}{n})\times(f[i]+1)+(\frac{n-i}{n})\times(f[i+1]+1)$$

  以前一直不懂平方的期望是怎么求的,今天终于证了一发。$$E((x+1)^2)=\sum_{i=0}^\infty P(x)*((x+1)^2)$$

  因为P后边的那个式子是一个具体的值所以可以拆开。

  $$E((x+1)^2)=\sum_{i=0}^\infty P(x)*((x+1)^2)=\sum_{i=0}^\infty P(x)*(x^2+2x+1)=\sum_{i=0}^\infty P(x)*(x^2)+2\times\sum_{i=0}^\infty P(x)*(x)+1=E[x^2]+2E[x]+1$$

  其中倒数第二步是根据期望的线性可加性得来。

  这样x^2的期望就可以由(x-1)^2的期望推来。

  所以g[i]和f[i]同理:$$g[i]=(\frac{i}{n})\times(g[i]+2\times f[i]+1)+(\frac{n-i}{n})\times(g[i+1]+2*f[i+1]+1)$$

  最后化简一下递推就行了。

  

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 #define N 100005
 6 using namespace std;
 7 double f[N],g[N];
 8 int main()
 9 {
10     int n;
11     scanf("%d",&n);
12     f[n]=0;g[n]=0;
13     for(int i=n-1;i>=0;i--)
14     {
15         f[i]=f[i+1]+(double)n/(n-i);
16         g[i]=g[i+1]+2.0*f[i+1]+2.0*i/(n-i)*f[i]+1.0*n/(n-i); 
17     }
18     printf("%.2lf\n",(g[0]+f[0])/2);
19     return 0;
20 }

 

 

 

bzoj 1426:收集邮票 求平方的期望