Tribles(概率)

Description
 

Problem A
Tribbles
Input: Standard Input

Output: Standard Output

GRAVITATIONn.
"The tendency of all bodies to approach one another with a strength
proportion to the quantity of matter they contain -- the quantity of
matter they contain being ascertained by the strength of their tendency
to approach one another. This is a lovely and edifying illustration of
how science, having made A the proof of B, makes B the proof of A."

Ambrose Bierce

You have a population of kTribbles. This particular species of Tribbles live for exactly one day and then die. Just before death, a single Tribble has the probability Pi of giving birth to i more Tribbles. What is the probability that after m generations, everyTribble will be dead?

Input
The first line of input gives the number of cases, NN test cases follow. Each one starts with a line containing n (1<= n<=1000) ,k (0<= k<=1000) and m (0<= m<=1000) . The next n lines will give the probabilities P0P1, ...,Pn-1.

Output
For each test case, output one line containing "Case #x:" followed by the answer, correct up to an absolute or relative error of 10-6.

Sample Input

Sample Output

4 
3 1 1
0.33 
0.34 
0.33 
3 1 2 
0.33 
0.34 
0.33 
3 1 2 
0.5 
0.0 
0.5 
4 2 2
0.5 
0.0 
0.0 
0.5
Case #1: 0.3300000 
Case #2: 0.4781370 
Case #3: 0.6250000 
Case #4: 0.3164062 

            
          

 

题意:有K只麻球,每只只活一天,临死前会产仔,产i只小麻球的 概率为pi,问m天后所有麻球全部死亡的概率;

思路:因为每只麻球都是相互独立的,所以只需求刚开始只有一只麻球,m天后其后代全部死亡的概率f[m],然后k只麻球最后全部死亡的概率就是 pow(f[m],k);

对于一只麻球,m天全死亡包含第一天、第二天、、、、、第m天死亡事件,因此一只麻球第i天死亡的概率f[i] = p0 + p1*f[i-1] + p2*f[i-2]^2+.......+ pn-1*f[i-1]^(n-1);

 1 #include<stdio.h>
 2 #include<math.h>
 3 #include<string.h>
 4 int main()
 5 {
 6     int test;
 7     scanf("%d",&test);
 8     for(int item = 1; item <= test; item++)
 9     {
10         int n,k,m;
11         double p[1100],f[1100];
12         scanf("%d %d %d",&n,&k,&m);
13         for(int i = 0; i < n; i++)
14             scanf("%lf",&p[i]);
15 
16         f[0] = 0;
17         f[1] = p[0];
18         for(int i = 2; i <= m; i++)
19         {
20             f[i] = 0;
21             for(int j = 0; j < n; j++)
22                 f[i] += p[j] * pow(f[i-1],j);
23         }
24         printf("Case #%d: %.7lf\n",item,pow(f[m],k));
25     }
26     return 0;
27 }
View Code

 

posted on 2013-11-03 19:29  straw_berry  阅读(293)  评论(0编辑  收藏  举报