题目大意:
k个虫子,每个虫子只能活一天。在虫子死时有pi的概率生出i个新虫子(0<=i<=n-1),求在m天后虫子全部死亡的概率。
(注意:虫子在m天之前死光也算)
题解:
独立+全概率公式
k个虫子死亡相互独立,所以考虑一个虫子:m天后全死光的概率f(m)
则有:
f(i)=p(0)+p(1)*f(i-1)+p(2)*(f(i-1)^2)+...+p(n-1)*(f(n-1)^(n-1))
即按照生几个后代分类,做到了不重复,不遗漏。
最后结果是f(i)^k;
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
double p[2010],f[2010];
int main()
{
int sec;
scanf("%d",&sec);
for(int z=1;z<=sec;z++)
{
int n,m,k;
scanf("%d%d%d",&n,&k,&m);
for(int i=0;i<=n-1;i++)
scanf("%lf",&p[i]);
if(k==0)
{
printf("Case #%d: %.7f\n",z,(double)0);
continue;
}
memset(f,0,sizeof(f));
f[0]=0;f[1]=p[0];
for(int i=2;i<=m;i++)
{
f[i]=p[0];
for(int j=1;j<=n-1;j++)
f[i]+=p[j]*pow(f[i-1],j);
}
double ans=pow(f[m],k);
printf("Case #%d: %.7f\n",z,ans);
}
return 0;
}