hdu 2519 - 求解组合数

来源:互联网 发布:java date sethour 编辑:程序博客网 时间:2024/05/01 08:34
Problem Description
开学了,杭电又迎来了好多新生。ACMer想为新生准备一个节目。来报名要表演节目的人很多,多达N个,但是只需要从这N个人中选M个就够了,一共有多少种选择方法?
 

Input
数据的第一行包括一个正整数T,接下来有T组数据,每组数据占一行。
每组数据包含两个整数N(来报名的人数,1<=N<=30),M(节目需要的人数0<=M<=30)
 

Output
每组数据输出一个整数,每个输出占一行
 

Sample Input
53 25 34 43 68 0
 

Sample Output
31010

1


最开始的思路是循环求出 n! 的值,但 30! 是根本不可能求解的,网上有种使用对数缩小阶乘范围,但我感觉可能会有浮点误差,所以我就回到了最初始的想法,既然 int 型能表示组合数,如果我可以模拟手算中的消去相同的因数,这题就应该可以解决!

#include"stdio.h"int main(){int a[100],b[100];int x,y,n; int i,j,k;scanf("%d",&n);while(n--){scanf("%d%d",&x,&y);if(x<y)//特殊情况直接排除,既方便思考,又能提高效率{printf("0\n");continue;}if(y==0){printf("1\n");continue;}for(i=x, k=y ; k>0 ; i--,k--)//模拟分子、分母{a[k] = i;}
for(i=y,k=1 ; i>0 ; i--,k++)b[k] = i;i=1;while(i<=y)//模拟计算{for(j=1 ; j<=y ; j++)if(a[j]%b[i]==0){a[j] = a[j]/b[i];b[i] = 1;break;}i++;} __int64 sum = 1;for(i=1 ; i<=y ; i++){sum = sum*a[i];}for(i=1 ; i<=y ; i++)//这里就写的不完美,因为很有可能在这里溢出,可以在此重复模拟计算,但会会耗费时间if(b[i]!=1)sum =sum/b[i];printf("%I64d\n",sum); }return 0;}

感觉这个代码做的不是特别的好,所以肯定需要精简!



0 0
原创粉丝点击