【数学期望】【2012 ACM/ICPC 成都赛区现场赛】【B.Candy】
【题目来源】http://acm.hdu.edu.cn/showproblem.php?pid=4465
【题目分析】公式: Ans = Sum{(N - I)* C(I, N + I) * (P^(N + 1) * Q^I + Q^(N + 1) * P ^I)},这个题目重在实现这个公式的技巧。我们注意到这个题目在中间过程可能会涉及高精度,但是结果是不会大于20W的。因此将之间的数都取Ln对数,最后在用指数还原。
【代码如下】
1 #include <iostream> 2 #include <iomanip> 3 #include <cstdio> 4 #include <cmath> 5 6 #define FILE_IO 7 8 using namespace std; 9 10 int N, Cnt; 11 double P, Q, Ans; 12 13 int main() 14 { 15 #ifdef FILE_IO 16 freopen("test.in", "r", stdin); 17 #endif // FILE_IO 18 while (cin >> N >> P) 19 { 20 Q = log(1 - P), P = log(P); 21 double Tp = (N + 1) * P, Tq = (N + 1) * Q, Ans = 0, Tc = 0; 22 for (int i = 0; i < N; ++i) 23 { 24 if (Tp + Tc > -30 || Tq + Tc > -30) Ans += (exp(Tp + Tc) +exp(Tq + Tc)) * (N - i); 25 Tp += Q, Tq += P, Tc += log(N + i + 1) - log(i + 1); 26 } 27 cout << "Case " << ++Cnt << ": "; 28 cout << setprecision(12) << setiosflags(ios :: fixed) << Ans << endl; 29 } 30 return 0; 31 }