【数学期望】【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 }

 

posted on 2013-02-07 16:21  孤星ぁ紫辰  阅读(302)  评论(0编辑  收藏  举报

导航