UVA 1639 - Candy(概率计算+对数处理+精度)

题目链接 https://cn.vjudge.net/problem/UVA-1639

【题意】
两个盒子各有n个糖(n<=2e5)每天选一个盒子,选择第一个盒子的概率为p,选择第二个盒子的概率为1-p,然后拿走盒子里的一颗糖. 直到有一天,打开盒子发现没糖了.输入n和p(0<=p<=1)求出当打开一个盒子发现没有糖时另一个盒子里糖果的数量的数学期望

【思路】
如果最后打开的是第一个盒子,此时第二个盒子里还有 i i 颗糖,那么在此之前已经打开了 n+(ni) 个盒子,其中有 n n 次选中了第一个盒子,有 ni 次选中了第二个盒子,同时最后一次选中了第一个盒子,所以对应的概率为

P1i=Cn2nipn+1(1p)ni P 1 i = C 2 n − i n p n + 1 ( 1 − p ) n − i

同理如果最后打开的是第二个盒子那么如果第一个盒子中还剩下 i i 颗糖的概率为
P2i=C2nin(1p)n+1pni

但要注意的是上面的式子没法直接计算,因为 n n 105 的规模,组合数会很大,这时就需要用对数来处理后再计算了

V1i=lnP1i=lnCn2ni+(n+1)lnp+(ni)ln(1p) V 1 i = ln ⁡ P 1 i = ln ⁡ C 2 n − i n + ( n + 1 ) ln ⁡ p + ( n − i ) ln ⁡ ( 1 − p )
V2i=lnP2i=lnCn2ni+(n+1)ln(1p)+(ni)lnp V 2 i = ln ⁡ P 2 i = ln ⁡ C 2 n − i n + ( n + 1 ) ln ⁡ ( 1 − p ) + ( n − i ) ln ⁡ p
组合数直接用定义展开即可,预处理一下 lnx ln ⁡ x 的前缀和就可以快速计算了
最后的期望其实就是
Ans=i=0n(eV1i+eV2i)×i A n s = ∑ i = 0 n ( e V 1 i + e V 2 i ) × i

还有个坑就是这道题用double精度都不够,必须用long double计算才能A

#include<bits/stdc++.h>
using namespace std;

const long double eps=1e-9;
const int maxn=200005;

int n;
double p,q;
long double Ln[maxn];

int main(){
    for(int i=2;i<maxn;++i){
        Ln[i]=Ln[i-1]+log(i);
    }
    int kase=0;
    while(scanf("%d%lf",&n,&p)==2){
        q=1.0-p;
        if(fabs(p)<eps || fabs(q)<eps){
            printf("Case %d: %d\n",++kase,n);
            continue;
        }
        long double ans=0;
        for(int k=0;k<=n;++k){
            long double x=Ln[n+k]-Ln[n]-Ln[k]+(long double)(n+1)*log(p)+(long double)k*log(q);
            ans+=(long double)exp(x)*(n-k);
            x=Ln[n+k]-Ln[n]-Ln[k]+(long double)(n+1)*log(q)+(long double)k*log(p);
            ans+=(long double)exp(x)*(n-k);
        }
        printf("Case %d: %Lf\n",++kase,ans);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值