Uva_11021 Tribles

题目链接

题意:

  现在有k只麻球, 每只麻球只能存活一天, 第二天就会死去, 死去之前可能生下x只小麻球(x = 0,1,2,...,n  1), 概率分别为P[0], P[1], ... , P[n - 1]。

  现求, m天之后, 所有麻球全死去的概率, 包括m天之前就已经全部死去。

 

思路:

  每只麻球都是相互独立的, 那么 可以先算初始只有一只麻球,m天之内全部死去的概率。

  设f(x) 为 初始只有一只麻球, x天后全部死去的概率。

  得:

    f(x) = P[0] * f(x - 1)^0 + P[1] * f(x - 1) + P[2] * f(x-1)^2 + .. + P[n - 1] * f(x - 1)^(n - 1)。

  P[j]为一只麻球生下j只小麻球的概率, 又因为所有的麻球都要在x天之内全部死去, 所以 这j只小麻球需要在x - 1天全部死去, 而每只麻球相互独立, 所以概率相乘。

  得:

    初始条件:f[0] = P[0]。

  递推得到f[m], 答案即为f[m] ^ k。

 

代码如下:

 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <ctime>
 6 #include <set>
 7 #include <map>
 8 #include <list>
 9 #include <queue>
10 #include <string>
11 #include <vector>
12 #include <fstream>
13 #include <iterator>
14 #include <iostream>
15 #include <algorithm>
16 using namespace std;
17 #define LL long long
18 #define MAXN 1010
19 #define MOD 1000000007
20 #define eps 1e-6
21 int n, k, m;
22 double P[MAXN];
23 double f[MAXN];
24 double qpow(double x, int k)
25 {
26     double res = 1.0;
27     while(k)
28     {
29         if(k & 1) res = res * x;
30         x = x * x;
31         k >>= 1;
32     }
33     return res;
34 }
35 void init()
36 {
37     memset(f, 0, sizeof(f));
38     f[0] = 0;
39     f[1] = P[0];
40     for(int x = 2; x <= m; x ++)
41         for(int j = 0; j < n; j ++)
42             f[x] = f[x] + P[j] * qpow(f[x - 1], j);
43 }
44 
45 int main()
46 {
47     int T;
48     int kcase = 0;
49     scanf("%d", &T);
50     while(T --)
51     {
52         scanf("%d %d %d", &n, &k, &m);
53         for(int i = 0; i < n; i ++)
54             scanf("%lf", &P[i]);
55         init();
56         printf("Case #%d: %.7lf\n", ++ kcase, qpow(f[m], k));
57     }
58     return 0;
59 }
View Code

 

posted @ 2015-07-28 11:12  若羽。  阅读(244)  评论(0编辑  收藏  举报