2012 ICPC/ACM 成都现场赛 Candy

题目来源:

http://acm.hdu.edu.cn/showproblem.php?pid=4465

 

题意:输入m,p;从两个盒子里各有n颗糖,每天取一颗,发现其中
一个盒子空,求另外一个盒子糖果数的期望。p,1-p为取糖概率;

分析: 给盒子编号 A,B , 

设另外一个盒子(为B) 剩  n - k 个 , 则 在过去的 (n + k)次 有 k 次 取到B , 且当前这次取到A 。

同理 对另外一个盒子为(A) 。

则 期望的公式为:

Σ( n - k) * C(n + k , k) * (  (1 - p) ^k  *  p ^(n + 1) + p ^k  * (1 - p)^(n + 1)  )  k = 0 ,1 ... n

对于 p^n 次方 肯定 爆double , 于是采用 先 log 再exp ,求值。 

C( n + k , k) = (n + k)! / ( n ! * k !) 

令 f(n) = n!  ,则 f(n) = f(n - 1) + log(n) 

log(p ^n) = n log (p) 

代码如下:

const int Max_N = 200010 ;
double f[Max_N] ;
double loglog(int n , int k){
    return f[n + k] - f[n] - f[k] ;
}
int main(){
    int n  , i  , T = 1;
    double p ;
     f[0]= 0 ;
     f[1] = 0 ;
    for(i = 2 ; i < Max_N ; i ++)
        f[i] = f[i -1] + log(1.0 * i) ;
    while(scanf("%d%lf" , &n ,&p) != EOF){
        double ans = 0.0 ;
        double p1 = log(p) ;
        double p2 = log(1 - p) ;
        for(i = 0 ; i <= n ; i++){
            ans += (n - i) * exp(loglog(n , i) + i * p2 + (n + 1) * p1) ;
            ans += (n - i) * exp(loglog(n , i) + i * p1 + (n+1) * p2) ;
        }
        printf("Case %d: %.6lf\n" , T ++ , ans) ;
    }
    return 0 ;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值