Uva1639(概率期望+自然对数)

来源:互联网 发布:人工智能 用什么开发 编辑:程序博客网 时间:2024/05/20 20:23

Solution

有两个盒子各有n(n≤2*10^5)个糖,每天随机选一个(概率分别为p,1-p),然后吃一
颗糖。直到有一天,打开盒子一看,没糖了!输入n, p,求此时另一个盒子里糖的个数的数
学期望。

  • 很显然,假设是第二个盒子最后有糖.

  • 那么可以枚举第二个盒子还剩多少个糖

  • 方案就是:C(2ni,n)pn+1(1p)ni

  • 但如果直接搞,精度会炸.

  • 我们可以运用自然对数的四个性质:

  • 四个性质:

    ln(a/b)=ln(a)ln(b)
    ln(ab)=ln(a)+ln(b)
    ln(ab)=ln(a)b
    exp(ln(a))=a

  • 求解即可.

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#define fo(i, a, b) for (i = a; i <= b; i++)#define Maxn 200010#define ld long doubleusing namespace std;int n,i,cas;ld p,Log[Maxn];int main(){    fo(i,1,Maxn)        Log[i] = Log[i - 1] + log(i);    while (scanf("%d%Lf",&n,&p)==2)    {        ld ans = 0;        fo (i,1,n)        {            ld c = Log[2 * n - i] - Log[n] - Log[n - i];            ld p1 = log(p) * (n + 1) + log(1.0 - p) * (n - i) + c;            ld p2 = log(p) * (n - i) + log(1.0 - p) * (n + 1) + c;            ans += i * (exp(p1) + exp(p2));        }        printf("Case %d: %Lf\n",++cas,ans);    }}
原创粉丝点击