题意:
某大学有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 "); 21 } 22 else if(s[h]==1) 23 { 24 printf("0 "); 25 } 26 else if(sum-s[h]<n-1) 27 { 28 printf("1 "); 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 ",1.0-(double)cnta); 44 } 45 46 return 0; 47 }