【BZOJ3093】A Famous Game-概率论+组合数学

测试地址: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(AB)=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(AB)
还有全概率公式: 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(ANk),其中 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(AB),那么:
P ( A ∣ B ) = P ( A B ) P ( B ) P(A|B)=\frac{P(AB)}{P(B)} P(AB)=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(BNk)P(Nk)k=0nP(ABNk)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(BNk)P(Nk)k=0nP(ABNk)P(BNk)P(Nk)
于是有:
P ( A ∣ B N k ) = k − q n − p P(A|BN_k)=\frac{k-q}{n-p} P(ABNk)=npkq
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(BNk)=CnqCkqCnkpq
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(AB)=k=0nCkqCnkpq(np)k=0nCkqCnkpq(kq)
= ∑ 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=0nCkqCnkpq(np)k=0nCkq+1Cnkpq(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}} =npq+1k=0nCkqCnkpqk=0nCkq+1Cnkpq
现在需要用到一个结论:
∑ 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=0sCknCskm=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(AB)=npq+1Cnp+1Cnp+2
= q + 1 n − p ⋅ n − p p + 2 =\frac{q+1}{n-p}\cdot \frac{n-p}{p+2} =npq+1p+2np
= q + 1 p + 2 =\frac{q+1}{p+2} =p+2q+1
于是答案就出来了,一行代码解决。
(题外话:BZOJ300AC在这一题正式达成,可喜可贺可喜可贺)
以下是本人代码:

#include 
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;
}

你可能感兴趣的:(数学-概率期望,数学-组合数学)