洛谷题解洛谷题解题解:UVA10056 What is the Probability ?
xyx404 思路:
为了计算第 i 个玩家的获胜概率,我们需要考虑所有可能的情况,即所有玩家轮流投掷直到某人获胜。给定 n 个玩家,每个玩家投掷成功的概率为 p,失败的概率为 1−p。
第 i 个玩家的获胜方式可以分为以下几种情况:
- 在第一轮中,第 i 个玩家直接获胜,这发生在前 i−1 个玩家都失败了之后,所以概率为 (1−p)i−1⋅p。
- 第 i 个玩家在第二轮获胜,这意味着所有 n 个玩家在第一轮都失败了,然后前 i−1 个玩家在第二轮也失败了,第 i 个玩家在第二轮获胜,所以概率为 (1−p)n⋅(1−p)i−1⋅p=(1−p)n+i−1⋅p。
- 同理,第i个玩家在第三轮获胜的概率为 (1−p)2n+i−1⋅p。
- 这个模式可以无限延续下去,形成一个无穷等比数列,其中首项为 (1−p)i−1⋅p,公比为 (1−p)n。
因此,第i个玩家获胜的总概率P可以表示为这个无穷等比数列的和:
P=(1−p)i−1⋅p+(1−p)n+i−1⋅p+(1−p)2n+i−1⋅p+…
这是一个等比数列的和,可以用公式计算:
P=1−(1−p)n(1−p)i−1⋅p
代码:
#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 记录。