传送门
推荐一个讲全概率公式的博客
条件概率:在事件
已发生的条件下,事件
发生的概率
记为
全概率公式:
使用条件是
互斥且
且
构成全集,即
题意:两人初始分别有N,M颗糖果,如果谁赢一局,就拿走对方一颗糖,直到拿完对方所有的糖为止。Speakless单局赢的概率为
,令一个单 局赢的概率为
,如果是平局,不会有任何糖果的得失。问最终Speakless赢的概率是多少。
本题题解:
定义
为Speakless初始拥有
颗糖果并最终取胜的概率
则答案为
记事件
则事件
为Speakless单局取胜,
为Speakless当局失败,
为平局。则在
已发生的条件下
发生就相当于初始Speakless有
个糖果并最终取胜,即
,同理
;
则有全概率公式为
显然
整理一下有
记
则
为等比数列,比为
所以
又
显然
两式一化求得
又
将
带入有
到此差不多解决了
但是有一些特殊的要先处理一下
按优先级从大到小判断排序
代码:
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
const int MX=4e2+7;
const int mod=9901;
using namespace std;
int p[MX],k[MX];
ll qpow(ll a,ll b,ll MOD=mod){for(ll ans=1;;a=a*a%MOD,b>>=1){if(b&1)ans=ans*a%MOD;if(!b)return ans;}}
ll inv(ll a,ll MOD=mod){return qpow(a,MOD-2,MOD);}
ll __gcm(ll a,ll b){return a*b/__gcd(a,b);}
unordered_map<ll,int>mp;
int g[MX];
int main()
{
ios::sync_with_stdio(0),cin.tie(0);
double p,q,ans;
ll N,M;
while(cin>>N>>M>>p>>q)
{
if(N==0)
{
cout<<0.00<<endl;
}
else if(M==0)
{
cout<<1.00<<endl;
}
else if(p==0||q==1)
{
cout<<0.00<<endl;
}
else if(q==0||p==1)
{
cout<<1.00<<endl;
}
else if(p==q)
{
ans=1.0*N/(N+M);
cout<<fixed<<setprecision(2)<<ans<<endl;
}
else {
double k=q*(1-p)/(p*(1-q));
double res=(1-pow(k,N))/(1-pow(k,N+M));
cout<<fixed<<setprecision(2)<<res<<endl;
}
}
}