hdu 4465 Candy - 概率 log 组合数
/* 两个瓶子里都装了n个糖果;从第一个瓶子拿的概率是p 当你再拿糖果的时候,发现瓶子空了 求这时候另外一个瓶子的剩余的糖果的数量的期望 计算过程会造成上溢和下溢 用log就不会了 */ #include<math.h> #include<stdio.h> double lognjie[400010]; double logC(int n,int m) { return lognjie[n]-lognjie[m]-lognjie[n-m];//c(n,m)=n!/((n-m)!*m!) log(c(n,m))=log(n!)-log(m!)-log((m-n)!) } int main() { int i,n,index=1; double p,q; lognjie[0]=0; for(i=1;i<=400000;++i) { lognjie[i]=lognjie[i-1]+log(1.0*i);//log(n!)=log((n-1)!)+log(n) } while(scanf("%d%lf",&n,&p)!=EOF) { double ret=0; q=1-p; for(i=0;i<=n;++i)//第二个盒子里边拿了i个 另外一个盒子取了n+1次 { ret+=(n-i)*(exp(logC(n+i,i)+(n+1)*log(1.0*p)+i*log(1.0*q))+exp(logC(n+i,i)+(n+1)*log(1.0*q)+i*log(1.0*p))); } printf("Case %d: %.6lf\n",index++,ret); } return 0; }
/* 期望公式Ε=∑ P * N p为概率 n为数量 P=p*C(n,m)*pn*(1-p)m-n c(m,n)=c(m-1,n)*m/(m-n) 概率 m=0 p^(n+1) m=1 p^(n+1)q m=2 p^(n+1)q^2 q的幂通过循环何以控制 p的还需要补充 */ #include<math.h> #include<stdio.h> double pro(int n,double p) { double zhong=1,ret=n*p; for(int m=1;m<=n;++m)//从第二个瓶子取m个 { zhong*=p*(1-p)*(m+n)/m; ret+=(n-m)*zhong; ret*=p; } return ret; } int main() { int n,index=1; double p; while(~scanf("%d%lf",&n,&p)) { double ret=pro(n,p)+pro(n,1-p); printf("Case %d: %.6lf\n",index++,ret); } return 0; }