新生晚会 HDU - 2519

新生晚会

HDU - 2519

开学了,杭电又迎来了好多新生。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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值