题目链接:
https://ac.nowcoder.com/acm/contest/1111/B
题意:
有一个盒子里放了a个红球,b个绿球,c个蓝球。取出每个球的概率一样。
现在就行一个游戏,每次拿出一个球并且不放回,一直到其中一种颜色的球全部取出结束。
结束的时候红球被取完获得一等奖,绿球被取完获得二等奖,蓝球被取完获得三等奖。
问获得一,二,三等奖的概率
题解:
如果可以对a个红球b个绿球c个蓝球进行全排列,排列的顺序表示取球的顺序。虽然其中一种球被取完之后就结束了,但也能看成是把所有的球全部取完,哪个球先取完就获得对应的奖。
如果红球先去完,那么全排列的最后一个球不可能是红球,只能是绿球和蓝球。
如果是绿球:全排列末尾是绿球的占 b/(a+b+c), 那么对于末尾是绿球的全排列,把所有绿球删掉之后末尾应该是蓝球,占c/(a+c)
那么 概率就是 b/(a+b+c) * c/(a+c)
末尾是蓝球同理, c/(a+b+c) * b/(a+b)
获得一等奖的概率就是 b/(a+b+c) * c/(a+c) + c/(a+b+c) * b/(a+b)
获得二三等奖同理。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);
}
void calc(ll a,ll b,ll c){
ll sum=a+b+c;
ll p=c*b;
ll q=sum*(a+b);
ll qq=sum*(a+c);
ll res=p*(qq+q);
ll ans=q*qq;
ll d=gcd(res,ans);
printf("%lld/%lld ",res/d,ans/d);
}
int main(){
ll a,b,c;
while(scanf("%lld%lld%lld",&a,&b,&c)!=EOF){
calc(a,b,c);
calc(b,a,c);
calc(c,a,b);
printf("\n");
}
return 0;
}