HDU - 4465 期望 + 取log优化
思路:这个求期望的公式很容易得到,但是在算的时候我们会遇到一个问题,就是组合数太大了根本存不下,
这时候就可以在计算的时候都取log,最后复原。。。 以前没遇到过。。
#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PII pair<int, int> using namespace std; const int N = 2e5 + 7; const int inf = 0x3f3f3f3f; const LL INF = 0x3f3f3f3f3f3f3f3f; const int mod = 1e9 + 7; int n; double p, sLog[N]; void init() { for(int i = 1; i < N; i++) sLog[i] = sLog[i-1]+log(i*1.0); } double comb(int n, int m) { return sLog[n] - sLog[m] - sLog[n-m]; } int main() { int cas = 1; init(); while(scanf("%d%lf", &n, &p) != EOF) { double ans = 0; double p1 = log(p); double p2 = log(1-p); for(int i = 0; i < n; i++) { ans += exp(comb(n+i, i)+(n+1)*p1+i*p2)*(n-i); ans += exp(comb(n+i, i)+(n+1)*p2+i*p1)*(n-i); } printf("Case %d: %.12f\n", cas++, ans); } return 0; } /* */