原题网址:http://acm.hdu.edu.cn/showproblem.php?pid=4465
枚举取完一盒后另一盒剩k颗糖,答案比较好推:
有一个要处理的问题和一个细节:问题是组合数会上溢,概率会下溢,只要将这两者都取ln最后用exp还原即可。细节是概率之所以是n+1次方是因为最后一次取到空盒子的那次是第n+1次,之所以不被统计入组合数是因为这一次并没有取糖果。
#include<bits/stdc++.h>
using namespace std;
const int N=200050;
double lnmu[2*N];
int n,cnt;
double p,lnp,lnq,ans;
int main(){
lnmu[1]=log(1.0);
for (int i=2;i<2*N;i++)
lnmu[i]=lnmu[i-1]+log(i);
while (~scanf("%d",&n)){
scanf("%lf",&p);
lnp=log(p);lnq=log(1-p);
ans=0;
for (int k=0;k<n;k++)
ans+=(n-k)*(exp(lnmu[n+k]-lnmu[k]-lnmu[n]+k*lnp+(n+1)*lnq)
+exp(lnmu[n+k]-lnmu[k]-lnmu[n]+(n+1)*lnp+k*lnq));
printf("Case %d: %.6f\n",++cnt,ans);
}
return 0;
}