hdu 4465 Candy 快速全排列

本题题意是给你两个罐子,每个里面都有n个糖,现在LazyChild每天要随机从一个里面拿出一个糖,且选择其中一个罐子的概率为p,问当他某天打开罐子时发现里面没有糖了,问另外一个罐子中糖果数的期望。

期望公式很好得出
hdu 4465 Candy 快速全排列 2012 Asia Chengdu Regional Contest B - Mike - Apple
 k是从剩余糖果的那个罐子取k个糖果。 。
很明显,200000太大了,不能直接排列组合。
然后需要一个快速排列组合函数:logC(m,n)

f[0]=0; for(int i=1;i<=400002;i++) f[i]=f[i-1]+log(i*1.0);

double logC(int m,int n){ return f[m]-f[n]-f[m-n]; }

有了上面的算式之后,C(m,n)=exp(logC(m,n))

所以算式变为
hdu 4465 Candy 快速全排列 2012 Asia Chengdu Regional Contest B - Mike - Apple

  q=1-p ;(n+1)p =(n+1)*log(p*1.0)   ,      kq = k*log(q*1.0)  ,

#include<cstdio>
#include<cmath>
double f[400005];
double logC(int m,int n){        //logC(m,n) = f[m]-f[n]-f[m-n]; 正不正确自己代入数验证。
    return f[m]-f[n]-f[m-n];
}
int main(){
    f[0]=0;
    for(int i=1;i<=400002;i++) f[i]=f[i-1]+log(i*1.0);     //为了算C(m,n)做得预处理
    int apple=1,n;
    double p,q;
    while(~scanf("%d",&n)){
        scanf("%lf",&p);
        q=1-p;
         double p1 = log(p), p2 = log(q);
        double ans=0;
        for(int k=0;k<=n;k++){
            ans+=(n-k)*( exp(logC(n+k,k)+(n+1)*p1+k*p2) + exp(logC(n+k,k)+(n+1)*p2+k*p1));
        }
        printf("Case %d: %.6f\n",apple++,ans);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值