【题目分析】
组合数+对数减少误差
【代码】
#include <cstdio>
#include <cstring>
#define eps 1e-10
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
long double lnfac[100001];
long double p;
int kase=0,n;
int main()
{
for (int i=2;i<=100000;++i) lnfac[i]=lnfac[i-1]+log(i);
while (scanf("%d%Lf",&n,&p)!=EOF)
{
long double ans=0;
for (int i=1;i<=n;++i)
ans+=i*(exp((n+1)*log(p)+(n-i)*log(1-p)+lnfac[2*n-i]-lnfac[n]-lnfac[n-i])
+exp((n+1)*log(1-p)+(n-i)*log(p)+lnfac[2*n-i]-lnfac[n]-lnfac[n-i]));
printf("Case %d: %.6Lf\n",++kase,ans+eps);
}
}