问题 AL: ACM CLUB晚会
时间限制: 1 Sec 内存限制: 32 MB
提交: 140 解决: 31
题目描述
ACM CLUB的会员越来越多了,为此,ACM CLUB想为会员们准备一个晚会,晚会节目由会员们表演。消息一出,报名要表演节目的会员很多,多达N个,但是由于场地和时间有限,只能从这N个人中选M个,请问一共有多少种选择方法?
输入
数据的第一行是一个正整数T,接下来有T组数据,每组数据占一行。
每组数据包含两个整数N(来报名的人数,1<=N<=30),M(节目需要的人数0<=M<=30)。
输出
每组数据输出一个整数,每个输出占一行。
样例输入 Copy
5 3 2 5 3 4 4 3 6 8 0
样例输出 Copy
3 10 1 0 1
代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <math.h>
using namespace std;
//longlong 在此情况下也有可能会溢出,所以必须选择一个较小值来进行排列组合,进行运算优化
unsigned long long find(int a,int b){
unsigned long long m=1,n=1;
for (int i = 1; i <=b; i++)
{
m*=a;
a--;
n*=i;
}
unsigned long long cc=m/n;
return (cc);
}
int main(){
int num;
int a,b;
cin>>num;
getchar();
if(num>0){
while(num--){
cin>>a>>b;
getchar();
if(a>=1&&b>=0&&a<=30&&b<=30){
if(a<b){
cout<<0;
if(num!=0){
cout<<endl;
}
}
else{
if(b==0||a==b){
cout<<1;
if(num!=0){
cout<<endl;
}
continue;
}
int temp=b>(a-b)?(a-b):b;
unsigned long long c=find(a,temp);
cout<<c;
if(num!=0){
cout<<endl;
}
}
}
}
}
}