因为p的n+1次方很小 所以全部进行对数处理来保持精度
设最后一次盒子1有i颗糖 i的概率就为 p^(n+1) * (1-p)^(n-i) * C(2*n-i, n)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#define SF scanf
#define PF printf
using namespace std;
typedef long long LL;
const int MAXN = 200000;
long double Log[MAXN * 2+10];
long double logC(int n, int k)
{
return Log[n] - Log[k] - Log[n-k];
}
int main()
{
for(int i = 1; i <= MAXN * 2; i++) Log[i] = Log[i-1] + log(i);
int n, kase = 0;
double p;
while(SF("%d%lf", &n, &p) == 2)
{
double ans = 0, logp = log(p), log1 = log(1-p);
PF("Case %d: ", ++kase);
for(int i = 1; i <= n; i++)
{
long double LOG = logC(2*n-i, n);
long double v1 = LOG + (n+1) * logp + (n-i) * log1;
long double v2 = LOG + (n+1) * log1 + (n-i) * logp;
ans += i * (exp(v1) + exp(v2));
}
PF("%lf\n", ans);
}
}