#include <cstdio>
#include <cmath>
const int maxn = 4E5 + 10;
int n, kase;
double fun[maxn] = {0}, p;
void init()
{
for (int i = 1; i < maxn; i++)
fun[i] = fun[i - 1] + log(i);
}
double C(int m, int n)
{
return (fun[m] - fun[n] - fun[m - n]);
}
int main(int argc, char const *argv[])
{
init();
while (~scanf("%d%lf", &n, &p))
{
double ans = 0;
for (int i = 0; i <= n; i++)
ans += (n - i) * (exp(C(n + i, i) + (n + 1) * log(1 - p) + i * log(p)) + exp(C(n + i, i) + (n + 1) * log(p) + i * log(1 - p)));
printf("Case %d: %.6lf\n", ++kase, ans);
}
return 0;
}
期望公式很好得出,但过不了,maxn太大了,double有误差。
需要快速排列组合模板。最后全部取log解决爆double的问题。
变成这样就好了。