题解:UVA10056 What is the Probability ?

思路:

为了计算第 ii 个玩家的获胜概率,我们需要考虑所有可能的情况,即所有玩家轮流投掷直到某人获胜。给定 nn 个玩家,每个玩家投掷成功的概率为 pp,失败的概率为 1p1-p

ii 个玩家的获胜方式可以分为以下几种情况:

  • 在第一轮中,第 ii 个玩家直接获胜,这发生在前 i1i-1 个玩家都失败了之后,所以概率为 (1p)i1p(1-p)^{i-1} \cdot p
  • ii 个玩家在第二轮获胜,这意味着所有 nn 个玩家在第一轮都失败了,然后前 i1i-1 个玩家在第二轮也失败了,第 ii 个玩家在第二轮获胜,所以概率为 (1p)n(1p)i1p=(1p)n+i1p(1-p)^{n} \cdot (1-p)^{i-1} \cdot p = (1-p)^{n+i-1} \cdot p
  • 同理,第i个玩家在第三轮获胜的概率为 (1p)2n+i1p(1-p)^{2n+i-1} \cdot p
  • 这个模式可以无限延续下去,形成一个无穷等比数列,其中首项为 (1p)i1p(1-p)^{i-1} \cdot p,公比为 (1p)n(1-p)^{n}

因此,第i个玩家获胜的总概率P可以表示为这个无穷等比数列的和:

P=(1p)i1p+(1p)n+i1p+(1p)2n+i1p+P = (1-p)^{i-1} \cdot p + (1-p)^{n+i-1} \cdot p + (1-p)^{2n+i-1} \cdot p + \ldots

这是一个等比数列的和,可以用公式计算:

P=(1p)i1p1(1p)nP = \frac{(1-p)^{i-1} \cdot p}{1-(1-p)^{n}}

代码:

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define itn int
#define ull unsigned long long
int T=1;
double solve(int n,int i,double p){
double q=1-p;// 失败概率
double fz=pow(q,i-1)*p;// 分子
double fm=1-pow(q,n);// 分母
double ans=fz/fm;
return ans;
}
int main(){
cin>>T;
while(T--){
int n,i;
double p;
cin>>n>>p>>i;
printf("%.4lf\n",p!=0?solve(n,i,p):0.0);// 三目运算符特判
}
return 0;
}


AC 记录