测试地址:A Famous Game
题目大意: 一个袋子里有
n
n
n个球,球的颜色只有红和蓝,红色球的数目为
0
0
0 ~
n
n
n的概率都是相等的。现在已经从里面取出了
p
p
p个球,其中
q
q
q个是红色,求下一个取出的球是红色的概率。
做法: 本题需要用到概率论+组合数学。
通过这道题,我终于意识到概率论这个东西真的不可能靠直觉算对…想出来这种东西的贝叶斯真是个神人…
本题需要用到的公式:
P
(
A
∣
B
)
=
P
(
A
B
)
P
(
B
)
P(A|B)=\frac{P(AB)}{P(B)}
P(A∣B)=P(B)P(AB)
条件概率公式,意为:在已经发生
B
B
B的条件下,发生
A
A
A的概率,等于
A
,
B
A,B
A,B同时发生的概率,除以
B
B
B发生的概率。至于原因,写成这样应该更好理解:
P
(
A
B
)
=
P
(
B
)
P
(
A
∣
B
)
P(AB)=P(B)P(A|B)
P(AB)=P(B)P(A∣B)
还有全概率公式:
P
(
A
)
=
∑
k
P
(
N
k
)
P
(
A
∣
N
k
)
P(A)=\sum_{k}P(N_k)P(A|N_k)
P(A)=∑kP(Nk)P(A∣Nk),其中
N
k
N_k
Nk是互斥(即不可能同时发生)的事件,且它们发生的概率之和为
1
1
1。
于是令
A
A
A为下一个取出的球是红球这个事件,
B
B
B为已取出的
p
p
p个球中有
q
q
q个是红球这个事件,
N
k
N_k
Nk为一开始的袋子里有
k
k
k个红球这个事件,则要求的就是
P
(
A
∣
B
)
P(A|B)
P(A∣B),那么:
P
(
A
∣
B
)
=
P
(
A
B
)
P
(
B
)
P(A|B)=\frac{P(AB)}{P(B)}
P(A∣B)=P(B)P(AB)
=
∑
k
=
0
n
P
(
A
B
∣
N
k
)
P
(
N
k
)
∑
k
=
0
n
P
(
B
∣
N
k
)
P
(
N
k
)
=\frac{\sum_{k=0}^nP(AB|N_k)P(N_k)}{\sum_{k=0}^nP(B|N_k)P(N_k)}
=∑k=0nP(B∣Nk)P(Nk)∑k=0nP(AB∣Nk)P(Nk)
=
∑
k
=
0
n
P
(
A
∣
B
N
k
)
P
(
B
∣
N
k
)
P
(
N
k
)
∑
k
=
0
n
P
(
B
∣
N
k
)
P
(
N
k
)
=\frac{\sum_{k=0}^nP(A|BN_k)P(B|N_k)P(N_k)}{\sum_{k=0}^nP(B|N_k)P(N_k)}
=∑k=0nP(B∣Nk)P(Nk)∑k=0nP(A∣BNk)P(B∣Nk)P(Nk)
于是有:
P
(
A
∣
B
N
k
)
=
k
−
q
n
−
p
P(A|BN_k)=\frac{k-q}{n-p}
P(A∣BNk)=n−pk−q
P
(
B
∣
N
k
)
=
C
k
q
C
n
−
k
p
−
q
C
n
q
P(B|N_k)=\frac{C_k^qC_{n-k}^{p-q}}{C_n^q}
P(B∣Nk)=CnqCkqCn−kp−q
P
(
N
k
)
=
1
n
+
1
P(N_k)=\frac{1}{n+1}
P(Nk)=n+11
代入上面的式子中,约掉所有能直接约掉的东西得到:
P
(
A
∣
B
)
=
∑
k
=
0
n
C
k
q
C
n
−
k
p
−
q
(
k
−
q
)
∑
k
=
0
n
C
k
q
C
n
−
k
p
−
q
(
n
−
p
)
P(A|B)=\frac{\sum_{k=0}^nC_k^qC_{n-k}^{p-q}(k-q)}{\sum_{k=0}^nC_k^qC_{n-k}^{p-q}(n-p)}
P(A∣B)=∑k=0nCkqCn−kp−q(n−p)∑k=0nCkqCn−kp−q(k−q)
=
∑
k
=
0
n
C
k
q
+
1
C
n
−
k
p
−
q
(
q
+
1
)
∑
k
=
0
n
C
k
q
C
n
−
k
p
−
q
(
n
−
p
)
=\frac{\sum_{k=0}^nC_k^{q+1}C_{n-k}^{p-q}(q+1)}{\sum_{k=0}^nC_k^qC_{n-k}^{p-q}(n-p)}
=∑k=0nCkqCn−kp−q(n−p)∑k=0nCkq+1Cn−kp−q(q+1)
=
q
+
1
n
−
p
⋅
∑
k
=
0
n
C
k
q
+
1
C
n
−
k
p
−
q
∑
k
=
0
n
C
k
q
C
n
−
k
p
−
q
=\frac{q+1}{n-p}\cdot \frac{\sum_{k=0}^nC_k^{q+1}C_{n-k}^{p-q}}{\sum_{k=0}^nC_k^qC_{n-k}^{p-q}}
=n−pq+1⋅∑k=0nCkqCn−kp−q∑k=0nCkq+1Cn−kp−q
现在需要用到一个结论:
∑
k
=
0
s
C
k
n
C
s
−
k
m
=
C
s
+
1
n
+
m
+
1
\sum_{k=0}^sC_k^nC_{s-k}^m=C_{s+1}^{n+m+1}
∑k=0sCknCs−km=Cs+1n+m+1
可以看做是,在
s
+
1
s+1
s+1中选择
n
+
m
+
1
n+m+1
n+m+1个数,
k
k
k就可以看做是在枚举第
n
+
1
n+1
n+1个数是哪一个。于是:
P
(
A
∣
B
)
=
q
+
1
n
−
p
⋅
C
n
p
+
2
C
n
p
+
1
P(A|B)=\frac{q+1}{n-p}\cdot \frac{C_n^{p+2}}{C_n^{p+1}}
P(A∣B)=n−pq+1⋅Cnp+1Cnp+2
=
q
+
1
n
−
p
⋅
n
−
p
p
+
2
=\frac{q+1}{n-p}\cdot \frac{n-p}{p+2}
=n−pq+1⋅p+2n−p
=
q
+
1
p
+
2
=\frac{q+1}{p+2}
=p+2q+1
于是答案就出来了,一行代码解决。
(题外话:BZOJ300AC在这一题正式达成,可喜可贺可喜可贺)
以下是本人代码:
#include <bits/stdc++.h>
using namespace std;
double n,p,q;
int main()
{
int t=0;
while(scanf("%lf%lf%lf",&n,&p,&q)!=EOF)
{
++t;
printf("Case %d: %.4lf\n",t,(q+1.0)/(p+2.0));
}
return 0;
}