题目大意
一开始有k个麻球,每一天所有麻球都会死去,但每个麻球都会产生0~n-1个新麻球,产生j个新麻球的概率为p[j],求m天所有麻球都死绝的概率。
思路
设1个麻球(包括其产生的后代)i天内死绝的概率为f[i],那么j个麻球第i天死绝的概率就是
f
[
i
]
j
f[i]^j
f[i]j,那么假设第一天的有1个麻球,它死去后产生了h个后代那么这h个后代必须在i-1天内死绝才能保证这1个麻球在i天内死绝,所以就能得出一个递推式
f
[
i
]
=
∑
j
=
0
n
−
1
p
[
j
]
f
[
i
−
1
]
j
f[i] = \sum_{j=0}^{n-1}p[j]{f[i-1]^j}
f[i]=j=0∑n−1p[j]f[i−1]j
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e3 + 10;
double p[maxn];
double f[maxn];
double power(double x, int n) {
double ret = 1.0, base = x;
while(n) {
if(n & 1) {
ret *= base;
}
n >>= 1;
base = base * base;
}
return ret;
}
int main()
{
// freopen("/Users/maoxiangsun/MyRepertory/acm/i.txt", "r", stdin);
int cas = 0;
int T;
scanf("%d", &T);
while(T--) {
int n,k,m;
scanf("%d%d%d", &n, &k, &m);
for(int i = 0; i < n; i++) {
scanf("%lf", &p[i]);
}
f[1] = p[0]; // 在第1天死绝说明产生了0个后代
for(int i = 2; i <= m; i++) {
f[i] = 0.0;
for(int j = 0; j < n; j++) {
f[i] += power(f[i-1], j)*p[j];
}
}
printf("Case #%d: %.7f\n", ++cas, power(f[m], k));
}
return 0;
}