题意翻译

题目大意

一开始有k种生物,这种生物只能活1天,死的时候有 p i p_{i} 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个整数,分别为 p 0 p_0 p0 p n 1 p_{n-1} pn1

输出格式

对于每一组数据,先输出"Case #x: " 再输出答案,精度要求在1e-6以内

设f[i] 为 一只球在 i 天全部死亡的概率 , 则
f[i] = p[0] + p[1] f [ i 1 ] f[i-1] f[i1] + p[2] f [ i 1 ] 2 f[i-1]^2 f[i1]2 + p[3] f [ i 1 ] 3 f[i-1]^3 f[i1]3 + … + p[n] f [ i 1 ] n f[i-1]^n f[i1]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 ;
}