UVa 11021

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1962

f(i) 表示 在有一只tribble 经过i天后全死掉的 概率

然后枚举tribble第一天生了多少个后代 所以:

f(i) = P0*(f(i-1)^0)+P1*(f(i-1)^1)+P2*(f(i-1)^2)+.......+Pn-1*(f(i-1)^n-1)

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<set>
#include<map>
#include<stack>
#include<vector>
#include<algorithm>
#include<queue>

#define ull unsigned long long
#define ll long long
#define lint long long
using namespace std;

const int INF=0x3f3f3f3f;
const int N=1003;
double p[N],f[N];
int main()
{
    //freopen("data.in","r",stdin);
    int T;
    scanf("%d",&T);
    for(int c=1;c<=T;++c)
    {
        printf("Case #%d: ",c);
        int n,k,m;
        scanf("%d %d %d",&n,&k,&m);
        for(int i=0;i<n;++i)
        scanf("%lf",&p[i]);
        for(int i=0;i<=m;++i)
        f[i]=0;
        for(int i=1;i<=m;++i)
        {
            for(int j=0;j<n;++j)
            f[i]+=(p[j]*pow(f[i-1],j));
        }
        printf("%.7lf
",pow(f[m],k));
    }
    return 0;
}