你有一坨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
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }