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("\n"); 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 }