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\n",pow(f[m],k)); } return 0; }