顯然如果收集了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(i)*(i+1)^2$$
因為P后邊的那個式子是一個具體的值所以可以拆開。
$$E((x+1)^2)=\sum_{i=0}^\infty P(i)*(i+1)^2=\sum_{i=0}^\infty P(i)*(i^2+2i+1)=\sum_{i=0}^\infty P(i)*(i^2)+2\times\sum_{i=0}^\infty P(i)*(i)+1=E[x^2]+2E[x]+1$$
其中倒數第二步是根據期望的線性可加性得來。
這樣x^2的期望就可以由(x-1)^2的期望推來。
所以g[i]和f[i]同理:設s[i]表示在從i點出發走了s[i]步后結束,g[i]=E(s[i]^2)。
$$g[i]=(\frac{i}{n})\times E((s[i]+1)^2)+(\frac{n-i}{n})\times E((s[i+1]+1)^2)$$
$$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 }