HDU 4465 Candy

式子是很好推的,只是当时不知道如何去控制精度问题。要知道P的N次方是很小的一个数。

最后的式子很简单的

for(int i=0;i<=n;i++)ans+=(n-i)*C(n+i,i)*(p^n*(1-p)^i + (1-p)^n*p^i);

又可以递推出C。  C(n+1,i+1)=C(n,i)*(n+1)/(i+1)...

然后因为直接算出P的N次方会很小,所以将这个数分解。分N次乘上去。

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

double solve(int n,double p)
{
    double ans=p*n;//因为最后还要去看看第一个箱子,所以最后还是得乘以一个P的
    double last=1;//递推的一个中间变量
    for(int i=1;i<=n;i++)
    {
        last*=(n+i)*(1-p)/i*p;//因为每个中间式子都要乘以N个P,所以每个新生成的中间式子都要补一个P
        ans+=last*(n-i);
        ans*=p;
    }
    return ans;
}

int main()
{
    int n;
    double p;
    int CASE=1;
    while(scanf("%d%lf",&n,&p)!=EOF)
    {
        printf("Case %d: %lf
",CASE++,solve(n,p)+solve(n,1-p));
    }
    return 0;
}


原文地址:https://www.cnblogs.com/dyllove98/p/3206621.html