神仙题啊……这思路到底是怎么来的……
ps:本题是第$k$次买邮票需要$k$元,而不是买的邮票标号为$k$时花费$k$元
我们设$g[i]$表示现在有$i$张,要买到$n$张的期望张数,设$P(x,i)$表示买$x$次能从$i$张买到$n$张的概率,则有$$g[i]=\sum_{x=0}^\infty x\times P(x,i)$$
然后考虑一下递推关系式,有$$g[i]=g[i+1]+\frac{n}{n-i},g[n]=0$$
于是就可以愉快的递推了
然后设$f[i][j]$表示现在有$i$张邮票,下一张邮票要花$j$元,买到$n$张的期望花费。不难发现如下的递推式$$f[i][j]=j+f[i][j+1]\times \frac{i}{n}+f[i+1][j+1]\times \frac{n-i}{i}$$
然而因为$j$可能是无限大,所以我们没办法简单的递推。
于是换一个角度思考,我们考虑在$f[i][j]$的情况下还需要买几次才能够买齐,则有$$f[i][j]=\sum_{x=0}^\infty (j+(j+1)+...+(j+x-1))\times P(x,i)$$
其中$x$表示枚举次数,小括号里是$x$次购买所需的花费
继续推$$f[i][j]=\sum_{x=0}^\infty \frac{x(2j+x-1)}{2} \times P(x,i)$$
然后把$j+1$带进去,可以得出$$f[i][j+1]-f[i][j]=\sum_{x=0}^\infty x\times P(x,i)=g[i]$$
然后再考虑一下原来的递推公式$$f[i][j]=j+f[i][j+1]\times \frac{i}{n}+f[i+1][j+1]\times \frac{n-i}{i}$$
$$f[i][j]=j+(f[i][j]+g[i])\times \frac{i}{n}+(f[i+1][j]+g[i+1])\times \frac{n-i}{i}$$
然后移项之后可得$$f[i][j]=\frac{(j+g[i]\times \frac{i}{n}+(f[i+1][j]+g[i+1])\times \frac{n-i}{i})\times n}{n-i}$$
然后考虑一下,因为答案是$f[1][0]$,所以所有$j$不等于$0$的情况对我们都没有用,于是可以把第二维省略,只考虑$j=0$的情况
$$f[i]=\frac{(j+g[i]\times \frac{i}{n}+(f[i+1]+g[i+1])\times \frac{n-i}{i})\times n}{n-i}$$
边界条件为$f[n]=0$
然后就可以直接递推了
1 //minamoto 2 #include3 const int N=10005; 4 double f[N],g[N],m;int n; 5 int main(){ 6 scanf("%d",&n),f[n]=g[n]=0,m=n; 7 for(int i=n-1;i>=0;--i) g[i]=g[i+1]+m/(m-i); 8 for(int i=n-1;i>=0;--i) 9 f[i]=((f[i+1]+g[i+1])*(m-i)/m+g[i]*i/m+1.0)*m/(m-i);10 printf("%.2lf\n",f[0]);11 return 0;12 }