測試地址:A Famous Game
題目大意: 一個袋子裏有n個球,球的顏色只有紅和藍,紅色球的數目爲0 ~ n的概率都是相等的。現在已經從裏面取出了p個球,其中q個是紅色,求下一個取出的球是紅色的概率。
做法: 本題需要用到概率論+組合數學。
通過這道題,我終於意識到概率論這個東西真的不可能靠直覺算對…想出來這種東西的貝葉斯真是個神人…
本題需要用到的公式:
P(A∣B)=P(B)P(AB)
條件概率公式,意爲:在已經發生B的條件下,發生A的概率,等於A,B同時發生的概率,除以B發生的概率。至於原因,寫成這樣應該更好理解:
P(AB)=P(B)P(A∣B)
還有全概率公式:P(A)=∑kP(Nk)P(A∣Nk),其中Nk是互斥(即不可能同時發生)的事件,且它們發生的概率之和爲1。
於是令A爲下一個取出的球是紅球這個事件,B爲已取出的p個球中有q個是紅球這個事件,Nk爲一開始的袋子裏有k個紅球這個事件,則要求的就是P(A∣B),那麼:
P(A∣B)=P(B)P(AB)
=∑k=0nP(B∣Nk)P(Nk)∑k=0nP(AB∣Nk)P(Nk)
=∑k=0nP(B∣Nk)P(Nk)∑k=0nP(A∣BNk)P(B∣Nk)P(Nk)
於是有:
P(A∣BNk)=n−pk−q
P(B∣Nk)=CnqCkqCn−kp−q
P(Nk)=n+11
代入上面的式子中,約掉所有能直接約掉的東西得到:
P(A∣B)=∑k=0nCkqCn−kp−q(n−p)∑k=0nCkqCn−kp−q(k−q)
=∑k=0nCkqCn−kp−q(n−p)∑k=0nCkq+1Cn−kp−q(q+1)
=n−pq+1⋅∑k=0nCkqCn−kp−q∑k=0nCkq+1Cn−kp−q
現在需要用到一個結論:
∑k=0sCknCs−km=Cs+1n+m+1
可以看做是,在s+1中選擇n+m+1個數,k就可以看做是在枚舉第n+1個數是哪一個。於是:
P(A∣B)=n−pq+1⋅Cnp+1Cnp+2
=n−pq+1⋅p+2n−p
=p+2q+1
於是答案就出來了,一行代碼解決。
以下是本人代碼:
#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;
}