题意:
现在有k只麻球, 每只麻球只能存活一天, 第二天就会死去, 死去之前可能生下x只小麻球(x = 0,1,2,...,n 1), 概率分别为P[0], P[1], ... , P[n - 1]。
现求, m天之后, 所有麻球全死去的概率, 包括m天之前就已经全部死去。
思路:
每只麻球都是相互独立的, 那么 可以先算初始只有一只麻球,m天之内全部死去的概率。
设f(x) 为 初始只有一只麻球, x天后全部死去的概率。
得:
f(x) = P[0] * f(x - 1)^0 + P[1] * f(x - 1) + P[2] * f(x-1)^2 + .. + P[n - 1] * f(x - 1)^(n - 1)。
P[j]为一只麻球生下j只小麻球的概率, 又因为所有的麻球都要在x天之内全部死去, 所以 这j只小麻球需要在x - 1天全部死去, 而每只麻球相互独立, 所以概率相乘。
得:
初始条件:f[0] = P[0]。
递推得到f[m], 答案即为f[m] ^ k。
代码如下:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <set>
#include <map>
#include <list>
#include <queue>
#include <string>
#include <vector>
#include <fstream>
#include <iterator>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
#define MAXN 1010
#define MOD 1000000007
#define eps 1e-6
int n, k, m;
double P[MAXN];
double f[MAXN];
double qpow(double x, int k)
{
double res = 1.0;
while(k)
{
if(k & ) res = res * x;
x = x * x;
k >>= ;
}
return res;
}
void init()
{
memset(f, , sizeof(f));
f[] = ;
f[] = P[];
for(int x = ; x <= m; x ++)
for(int j = ; j < n; j ++)
f[x] = f[x] + P[j] * qpow(f[x - ], j);
} int main()
{
int T;
int kcase = ;
scanf("%d", &T);
while(T --)
{
scanf("%d %d %d", &n, &k, &m);
for(int i = ; i < n; i ++)
scanf("%lf", &P[i]);
init();
printf("Case #%d: %.7lf\n", ++ kcase, qpow(f[m], k));
}
return ;
}