cf 108b basketball team 组合数学

题意:

某大学有m个学院,每一个学院有si个人,现在要组建一支有n个人的篮球队,已经知道男主角在第h个学院,还有他先被球队录取了,现在学院在剩下的所有人中等概率的挑选出n-1个人

问:男主角想知道球队里面还有人和他来自同一个学院的概率,若不够人数,则输出-1

这道题很简单的组合数学题,但是要注意,计算的中间过程溢出。

 

 1 #include<cstdio>
 2 
 3 const int maxn=1010;
 4 #define LL long long
 5 
 6 int s[maxn];
 7 
 8 int main()
 9 {
10     int n,m,h;
11     scanf("%d%d%d",&n,&m,&h);
12     int sum=0;
13     for(int i=1;i<=m;i++)
14     {
15         scanf("%d",&s[i]);
16         sum+=s[i];
17     }
18     if(sum<n)
19     {
20         printf("-1\n");
21     }
22     else if(s[h]==1)
23     {
24         printf("0\n");
25     }
26     else if(sum-s[h]<n-1)
27     {
28         printf("1\n");
29     }
30     else
31     {
32         s[h]--;
33         sum--;
34         double cnta=1;
35         for(LL i=sum-s[h]-n+2;i<=sum-n+1;i++)
36         {
37             cnta*=i;
38         }
39         for(LL i=sum-s[h]+1;i<=sum;i++)
40         {
41             cnta=cnta/i;
42         }
43         printf("%.6f\n",1.0-(double)cnta);
44     }
45 
46     return 0;
47 }
View Code

 

posted on 2015-07-28 22:51  _fukua  阅读(208)  评论(0编辑  收藏  举报