题目
思路
d
p
[
i
]
:
dp[i]:
dp[i]:第
i
i
i天全部死亡的概率
p
[
i
]
:
p[i]:
p[i]:生
i
i
i只这种生物的概率
推式子:
d
p
[
i
]
=
p
[
0
]
+
p
[
1
]
∗
d
p
[
i
−
1
]
+
p
[
2
]
∗
d
p
[
i
−
1
]
2
+
.
.
.
+
p
[
n
−
1
]
∗
d
p
[
i
−
1
]
(
n
−
1
)
dp[i]=p[0]+p[1]*dp[i-1]+p[2]*dp[i-1]^2+...+p[n-1]*dp[i-1] ^{(n-1)}
dp[i]=p[0]+p[1]∗dp[i−1]+p[2]∗dp[i−1]2+...+p[n−1]∗dp[i−1](n−1)
p
[
j
]
∗
d
p
[
i
−
1
]
j
:
p[j]*dp[i-1]^j:
p[j]∗dp[i−1]j:次生物生了j个后代,这些后代在
i
−
1
i-1
i−1天后 全死亡的概率
由于一共有
k
k
k种生物,所以最后答案为
d
p
[
m
]
k
dp[m]^k
dp[m]k
代码
(交不了 不知正误)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
//#define int long long
const int N = 1e5+10;
const double eps=1e-8;
double dp[1100];//第i天全部死亡概率
double p[1100];
signed main(){
// ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t,n,k,m;cin>>t;
for(int cnt=1;cnt<=t;cnt++){
cin>>n>>k>>m;
for(int i=0;i<n;i++)cin>>p[i];
for(int i=1;i<=m;i++){//第i天
dp[i]=p[0];
for(int j=1;j<n;j++){//生j个
dp[i]+=p[j]*pow(dp[i-1],j);
}
}
printf("Case #%d: %.7lf\n",cnt,pow(dp[m],k));
}
return 0;
}