Description
Problem A
Tribbles
Input: Standard Input
Output: Standard Output
GRAVITATION, n. |
Ambrose Bierce
You have a population of k Tribbles. 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, N. N 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 P0, P1, ..., 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 |
/*此题是很经典的全概率问题。要求m代后绝种的概率。只需分别求出一只毛球在第一代到第m带刚好绝种的概率,相加即可
此题每只毛球最多可能生到1000个孩子,代数上限是1000.求一只到第i代绝种的概率,可以利用一只到i-1代绝种的概率
过程如下:一只成功生下一个孩子的概率*一只i-1代绝种的概率
一只成功生下二个孩子的概率*(一只i-1代绝种的概率的平方)
以此类推即可*/
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
long double p[1010],f[1010];
int i,n,m,j,k,tt;
long double t,ans,ans1;
scanf("%d",&tt);//输入样例数
for (int u=1;u<=tt;u++)
{
scanf("%d%d%d",&n,&k,&m);
for (i=0;i<n;i++)
scanf("%lf",&p[i]);//p[i]代表每只毛球生i个孩子的概率
f[1]=p[0];ans1=f[1];//f[1]=p[0] p[0]表示生0个孩子 f[i]代表一只毛球经过i代死光的概率
for (i=2;i<=m;i++)
{
t=f[i-1];f[i]=0;
for (j=1;j<n;j++)
{
f[i]+=t*p[j];
t*=f[i-1];
}
ans1+=f[i];
}
ans=1;
for (i=1;i<=k;i++)//k是初始的毛球数目
ans*=ans1;
printf("Case #%d: %.7lf\n",u,ans);
}
}