cogs 1487. 麻球繁衍

你有一坨K个毛球。这种毛球只会存活一天。在死亡之前,一个毛球有P_i的概率生出i个毛球(i=0,1,...,n-1)。m天后所有毛球都死亡的概率是多少?(包含在第m天前全部死亡的情况)

 

题解:

由于k只毛球之间的繁殖互不影响,所以只要求出一只毛球在第m天全死的概率即可

设f[i]为一只毛球在第i天毛球全死的概率,

 f[0]=p[0]    f[i]=∑f[i-1]^j*p[j]  (感性理解:f[i]为在第i天死光的概率,枚举生了j个儿子)

                                            (                 f[i-1]^j才表示在第i-1天毛球全都死光         )

f[1]=p0

f[2]=p0 (f[1]) +∑(p0^i*pi)

f[3]=p0+∑(p0^i*pi) (f[2]) +∑∑(p0^(i+j)*pi*pj)

.........

好像看不出规律

那就感性理解

f[i]=(f[i-1]-p0+1)*∑(p0^i)∑(pi)+p0

最后ans=p[m]^k

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #define mem(a,b) memset(a,b,sizeof(a))
 5 #define dd double
 6 using namespace std;
 7 
 8 int T;
 9 int n,k,m;
10 dd p[1001];
11 dd f[1001];
12 
13 dd mi(dd a,int b)
14 {
15     dd ans=1.0;
16     while(b)
17     {
18         if(b&1)
19             ans=ans*a;
20         a=a*a;
21         b>>=1;
22     }
23     return ans;
24 }
25 
26 int main(){
27     cin>>T;
28     for(int l=1;l<=T;++l)
29     {
30         cin>>n>>k>>m;
31         for(int i=0;i<n;++i) scanf("%lf",&p[i]);
32         mem(f,0);
33         f[1]=p[0];
34         for(int i=2;i<=m;++i)
35           for(int j=0;j<n;++j)
36                 f[i]+=p[j]*mi(f[i-1],j);
37         printf("Case #%d: %.7lf\n",l,mi(f[m],k));
38     }
39     return 0;
40 }
code

 

posted @ 2017-07-26 15:16  A_LEAF  阅读(152)  评论(0编辑  收藏  举报