问题
分析
设被取完的是第一个盒子,最后打开的是第一个盒子,同时第二个盒子发现有i颗,所以一共拿了n+n-i颗糖,概率是,最后一个p代表最后一次打开的是第一个盒子,发现为空
因为n最大时,那么会很大接近0,同时,为了防止损失精度,采用对数,所以最后打开的是第一个盒子,第二个盒子剩余i个概率是
最后打开的是第二个盒子,第一个盒子剩余i个概率是
总的期望是
要使用long double确保精度
参考:https://www.cnblogs.com/dwtfukgv/p/5538719.html
#include <cstring>
#include <cstdio>
#include <vector>
#include <iostream>
#include <cmath>
#include <vector>
#include <utility>
using namespace std;
typedef long double ld;
const int maxn=400010;
long double ln_ld[maxn]; //ln_ld[i]存储ln(i!)的值
int n,kase=0;
double p;
void init(){
ln_ld[1]=0; //ln(1)=0
for(int i=2;i<maxn;++i){
ln_ld[i]=ln_ld[i-1]+log(i);
}
}
int main(void){
init();
while(scanf("%d%lf",&n,&p)!=EOF){
long double ans=0;
for(int i=1;i<=n;++i){
long double c=ln_ld[2*n-i]-ln_ld[n]-ln_ld[n-i]; //ln(C(2n-i,n))
long double v=exp(c+(n+1)*log(p)+(n-i)*log(1-p))+exp(c+(n+1)*log(1-p)+(n-i)*log(p));
ans+=i*v;
}
printf("Case %d: %.6lf\n",++kase,(double)ans);
}
return 0;
}
来源:CSDN
作者:carut
链接:https://blog.csdn.net/zpf1998/article/details/104262253