2016湘潭邀请赛—Gambling

http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1244

题意:
有a个红球,b个绿球,c个黄球,先拿完a个红球一等奖,先拿完b个绿球二等奖,c个黄球三等奖。求各个奖获奖的概率。

思路:

分析首先拿完红球,即拿一等奖的概率:

我们假设拿完红球后继续拿,也就是拿完所有的球。

接下来逆向思考,红球不可能是最后一个,最后一个只可能是黄球或绿球,我们可以把摸出来的球的顺序逆置,比如(红,黄,红,绿,绿,黄,绿)逆置之后就是(绿,黄,绿,绿,红,黄,红),你会发现,你第一个摸到的球的颜色一定会是黄、绿当中的一种,而摸到的第二种颜色的球一定是黄绿当中未摸到过的,这样的话就很好计算了。

那么如果最后一个球是黄球,它的概率就是c/(a+b+c),除去黄球,最后一个是绿球的概率就是b/(a+b)。此时概率就是两者相乘。

最后一个球是绿球的话也是这样分析。

二等奖和三等奖也如上分析即可。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<queue>
 7 #include<cmath>
 8 #include<map>
 9 using namespace std;
10 
11 typedef long long LL;
12 
13 LL a,b,c;
14 
15 LL gcd(LL a,LL b)
16 {
17     return b==0?a:gcd(b,a%b);
18 }
19 
20 void cacl(LL a, LL b, LL c,int flag)
21 {
22     LL z=b*c*(2*a+b+c);
23     LL m=(a+b+c)*(a+b)*(a+c);
24     LL g=gcd(m,z);
25     printf("%I64d/%I64d",z/g,m/g);
26     if(flag<=2)  printf(" ");
27     else printf("
");
28 }
29 
30 int main()
31 {
32     //freopen("D:\input.txt","r",stdin);
33     while(~scanf("%lld%lld%lld",&a,&b,&c))
34     {
35         cacl(a,b,c,1);
36         cacl(b,a,c,2);
37         cacl(c,a,b,3);
38     }
39     return 0;
40 }
原文地址:https://www.cnblogs.com/zyb993963526/p/6735370.html