新生晚会
开学了,杭电又迎来了好多新生。ACMer想为新生准备一个节目。来报名要表演节目的人很多,多达N个,但是只需要从这N个人中选M个就够了,一共有多少种选择方法?
Input
数据的第一行包括一个正整数T,接下来有T组数据,每组数据占一行。
每组数据包含两个整数N(来报名的人数,1<=N<=30),M(节目需要的人数0<=M<=30)
Output
每组数据输出一个整数,每个输出占一行
Sample Input
5
3 2
5 3
4 4
3 6
8 0
Sample Output
3
10
1
0
1
表示这道题考组合数,谁赞成,谁反对?
关键在于对组合数的优化,刘大爷书上有写。不过我忘了。
不过这里能用递推去做。还记得高中组合数的一个规律公式吗?(我知道你忘了我也忘了)
n为上标,m为下标。 即Cnm=Cn(m-1) + C(n-1)(m-1);利用这个递推公式可以来算。当然以后会有很多解法,目前这个解法对我来说比较实际(?)。n=0时,返回的是m;n=1或者n=m时,返回是1;由此找到了递归的尽头;
同时注意样例中的最后两行要分开讨论特殊情况
上代码:
#include<stdio.h>
long int fabs(long int a,long int k);
int main(void)
{
int t,i;
long int n,m;
while(scanf("%d",&t)!=EOF)
{
for(i=0;i<t;i++)
{
scanf("%ld%ld", &n, &m);
if(n<m)
printf("0\n");
else if(n!=0&&m==0)
printf("1\n");
else
printf("%ld\n",fabs(n,m));
}
}
return 0;
}
long int fabs(long int a,long int k)
{
if(k==0||a==k)
{
return 1;
}
else if(k==1)
{
return a;
}
else
{
return fabs(a-1,k)+fabs(a-1,k-1);
}
}
AC