题意翻译
题目大意
一开始有k种生物,这种生物只能活1天,死的时候有 pi 的概率产生i只这种生物(也只能活一天),询问m天内所有生物都死的概率(包括m天前死亡的情况)
输入格式
第一行输入一个整数T,表示数据总数
每一组先输入三个整数n(1<=n<=1000),k(0<=k<=1000),m(0<=m<=1000)n(1<=n<=1000),k(0<=k<=1000),m(0<=m<=1000)
然后输入n个整数,分别为 p0 到 pn−1
输出格式
对于每一组数据,先输出"Case #x: " 再输出答案,精度要求在1e-6以内
设f[i] 为 一只球在 i 天全部死亡的概率 , 则
f[i] = p[0] + p[1] f[i−1] + p[2] f[i−1]2 + p[3] f[i−1]3 + … + p[n] f[i−1]n ;
初始状态 : f[0] = 0 , f[1] = p[0] ;
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#define maxn 1100
using namespace std ;
int read() {
int x = 0 , f = 1 ; char s = getchar() ;
while(s > '9' || s < '0') {if(s == '-') f = -1 ; s = getchar() ;}
while(s <='9' && s >='0') {x = x * 10 + (s-'0'); s = getchar() ;}
return x*f ;
}
int T ;
int n , k , m , num ;
double p[maxn] , f[maxn] ;
int main () {
T = read() ;
while(T --) {
num ++ ;
memset(f,0,sizeof(f)) ;
memset(p,0,sizeof(p)) ;
n = read() , k = read() , m = read() ;
for(int i = 0 ; i < n ; i ++)
cin >> p[i] ;
f[0] = 0 , f[1] = p[0] ;
for(int i = 2 ; i <= m ; i ++) {
for(int j = 0 ; j < n ; j ++) {
f[i] += p[j]*pow(f[i-1],j) ;
}
}
printf("Case #%d: %.7lf\n",num,pow(f[m],k)) ;
}
return 0 ;
}