一开始手推概率,结果发现结果一直对不上。后来发现是计算器没用好。。。
比较好思考的是 求k只麻球的概率 其实是求 一只麻球的概率^k的概率 (因为乘法原理,每个麻球的概率都是相对独立的所以乘起来)
我们设 1只麻球,m天后死亡的概率是 f(m)
那么根据全概率公式就有 $f(i)=P_0+f(i-1)\times P_1+f(i-1)^{2}\times P_2+f(i-1)^{3}\times P_3 +.....+f(i-1)^{n-1}\times P_n-1$
对于我这种萌新,我第一眼看过去内心是wc的,但是你手推一推会发现其实很好理解:
第一天死亡的只有P0
第二天死亡的会有 昨天产生0个的麻球今天死亡了 昨天产生1个的麻球今天死亡了 昨天产生的2个麻球今天死亡了 昨天产生的3个麻球今天死亡...
第二天死亡的会有 昨天产生0个的麻球今天死亡了 昨天产生1个的麻球今天死亡了 昨天产生的2个麻球今天死亡了 昨天产生的3个麻球今天死亡...
代码实现并不难,只不过需要一定的思考~
#include <algorithm> #include <cstdio> #include <cstring> #include <cmath> inline int Read(){ int ans = 0,flag=1; char ch=getchar(); while(ch<‘0‘ || ch>‘9‘){ if(ch==‘-‘)flag=-1; ch=getchar(); } while(ch>=‘0‘ && ch<=‘9‘){ ans = ans * 10 + ch - ‘0‘; ch = getchar(); } return flag*ans; } int T; int n,k,m; double P[1005],dp[1005]; double Pow(double num,int x){ double ans = 1; while(x){ if(x&1) ans*=num; num*=num; x>>=1; } return ans; } int main(){ freopen("tribbles.in","r",stdin); freopen("tribbles.out","w",stdout); T = Read(); for(register int i=1;i<=T;++i){ n = Read(); k = Read(); m = Read(); for(register int now=0;now<n;++now){ scanf("%lf",&P[now]); } dp[0]=0; dp[1]=P[0]; for(register int day = 2;day<=m;++day){ dp[day] = 0; for(register int now = 0 ;now<n;++now) dp[day]+=P[now]*Pow(dp[day-1],now); } printf("Case #%d: %.7lf\n",i,Pow(dp[m],k)); } }
别学我写快速幂啊,直接用Pow不容易出错
时间: 2024-12-26 21:09:15