http://blog.csdn.net/u014427196/article/details/46425645
http://www.ifrog.net/acm/problem/1055
题意:
一个盒子一开始有n个球,每个球标号唯一,先执行操作1,如果两个球x,y满足|x-y|不在盒子里,那么久把|x-y|放进去,设操作次数为p1,然后执行操作2,不断摸球,直到所有球都被摸过,设操作次数为p2,求p1+p2的期望。
思路:
如果两个球x,y在盒子里,设x>=y,那么gcd(x,y) == gcd(x,x-y),可以推出最后所有数的gcd等价于一开始所有数的gcd,那么操作1的次数就是最大的数/gcd。
操作2的次数容易推导,设dp[i]表示已经摸了i个球,直到摸完所有球的期望次数。显然有 dp[n]=0,dp[i]=i/n?dp[i]+(n?i)/n?dp[i+1]+1
化简下dp[n] = 0, dp[i] = dp[i+1]+n/i。
那么dp[0] = n*Hn,其中Hn是调和级数。
然后算就行了。
注意需要特判0。