传送门
推荐一个讲全概率公式的博客
条件概率:在事件
B
B
B已发生的条件下,事件
A
A
A发生的概率
记为
P
(
A
∣
B
)
P(A|B)
P(A∣B)
全概率公式:
P
(
A
)
=
∑
i
=
1
n
P
(
B
i
)
⋅
P
(
A
∣
B
i
)
P(A)=\sum\limits_{i=1}^{n}P(B_i)\cdot P(A|B_i)
P(A)=i=1∑nP(Bi)⋅P(A∣Bi)
使用条件是
B
i
B_i
Bi互斥且
B
i
B_i
Bi且
B
i
B_i
Bi构成全集,即
∑
i
=
1
n
P
(
B
i
)
=
1
\sum\limits_{i=1}^{n}P(B_i)=1
i=1∑nP(Bi)=1
题意:两人初始分别有N,M颗糖果,如果谁赢一局,就拿走对方一颗糖,直到拿完对方所有的糖为止。Speakless单局赢的概率为
p
p
p,令一个单 局赢的概率为
q
q
q,如果是平局,不会有任何糖果的得失。问最终Speakless赢的概率是多少。
本题题解:
定义
u
j
u_j
uj为Speakless初始拥有
j
j
j颗糖果并最终取胜的概率
则答案为
u
N
u_N
uN
记事件
P
(
A
)
=
u
j
P(A)=u_j
P(A)=uj
则事件
B
1
B_1
B1为Speakless单局取胜,
B
2
B_2
B2为Speakless当局失败,
B
3
B_3
B3为平局。则在
B
1
B_1
B1已发生的条件下
A
A
A发生就相当于初始Speakless有
j
+
1
j+1
j+1个糖果并最终取胜,即
P
(
A
∣
B
1
)
=
u
j
+
1
P(A|B_1)=u_{j+1}
P(A∣B1)=uj+1,同理
P
(
A
∣
B
2
)
=
u
j
−
1
,
P
(
A
∣
B
3
)
=
u
j
P(A|B_2)=u_{j-1}, P(A|B_3)=u_j
P(A∣B2)=uj−1,P(A∣B3)=uj;
则有全概率公式为
P
(
A
)
=
P
(
B
1
)
u
j
+
1
+
P
(
B
2
)
u
j
−
1
+
P
(
B
3
)
u
j
P(A)=P(B_1)u_{j+1}+P(B_2)u_{j-1}+P(B_3)u_j
P(A)=P(B1)uj+1+P(B2)uj−1+P(B3)uj
显然
P
(
B
1
)
=
p
(
1
−
q
)
,
记
为
P
,
P
(
B
2
)
=
q
(
1
−
p
)
,
记
为
Q
,
P
(
B
3
)
=
1
−
P
−
Q
P(B_1)=p(1-q),记为P,P(B_2)=q(1-p),记为Q,P(B_3)=1-P-Q
P(B1)=p(1−q),记为P,P(B2)=q(1−p),记为Q,P(B3)=1−P−Q
整理一下有
u
j
+
1
−
u
j
u
j
−
u
j
−
1
=
Q
P
\frac{u_{j+1}-u_j}{u_j-u_{j-1}}=\frac{Q}{P}
uj−uj−1uj+1−uj=PQ
记
g
[
i
]
=
u
i
−
u
i
−
1
g[i]=u_i-u_{i-1}
g[i]=ui−ui−1
则
g
[
i
]
g[i]
g[i]为等比数列,比为
k
=
Q
P
k=\frac{Q}{P}
k=PQ
所以
g
[
1
]
+
g
[
2
]
+
⋯
+
g
[
N
+
M
]
=
g
[
1
]
⋅
(
1
−
k
N
+
M
)
1
−
k
g[1]+g[2] +\cdots +g[N+M]=\frac{g[1]\cdot(1-k^{N+M})}{1-k}
g[1]+g[2]+⋯+g[N+M]=1−kg[1]⋅(1−kN+M)
又
g
[
1
]
+
g
[
2
]
+
⋯
+
g
[
N
+
M
]
=
u
1
−
u
0
+
u
2
−
u
1
+
⋯
+
u
N
+
M
−
u
N
+
M
−
1
=
u
N
+
M
−
u
0
g[1]+g[2]+\cdots+g[N+M]=u_1-u_0+u_2-u_1+\cdots+u_{N+M}-u_{N+M-1}=u_{N+M}-u_0
g[1]+g[2]+⋯+g[N+M]=u1−u0+u2−u1+⋯+uN+M−uN+M−1=uN+M−u0
显然
u
0
=
0
,
u
N
+
M
=
1
u_0=0,u_{N+M}=1
u0=0,uN+M=1
两式一化求得
u
1
u_1
u1
又
g
[
1
]
+
g
[
2
]
+
g
[
3
]
+
⋯
+
g
[
N
]
=
u
1
−
u
0
+
⋯
+
u
N
−
u
N
−
1
=
u
N
=
g
[
1
]
⋅
(
1
−
k
N
)
1
−
k
g[1]+g[2]+g[3]+\cdots+g[N]=u_1-u_0+\cdots+u_N-u_{N-1}=u_N=\frac{g[1]\cdot(1-k^{N})}{1-k}
g[1]+g[2]+g[3]+⋯+g[N]=u1−u0+⋯+uN−uN−1=uN=1−kg[1]⋅(1−kN)
将
g
[
1
]
g[1]
g[1]带入有
u
N
=
1
−
k
N
1
−
k
N
+
M
u_N=\frac{1-k^N}{1-k^{N+M}}
uN=1−kN+M1−kN
到此差不多解决了
但是有一些特殊的要先处理一下
按优先级从大到小判断排序
N
=
0
,
则
u
N
=
0
N=0,则u_N=0
N=0,则uN=0
M
=
0
,
则
u
N
=
1
M=0,则u_N=1
M=0,则uN=1
p
=
=
0
∣
∣
q
=
=
1
,
则
u
N
=
0
p==0||q==1,则u_N=0
p==0∣∣q==1,则uN=0
q
=
=
0
∣
∣
p
=
=
1
,
则
u
N
=
1
q==0||p==1,则u_N=1
q==0∣∣p==1,则uN=1
q
=
=
p
(
这
个
也
需
要
特
判
,
不
然
会
出
现
除
零
)
,
则
u
N
=
N
/
(
N
+
M
)
q==p(这个也需要特判,不然会出现除零),则u_N=N/(N+M)
q==p(这个也需要特判,不然会出现除零),则uN=N/(N+M)
代码:
#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;
}
}
}