Description
求C(N, M),即求M个数中选N个数的组合方案数。
题目:组合数
Input
第一行一个正整数T (T<=10), 表示有T组测试数据。第二行~第T+1行,每行有2个正整数N,M (1<=N, M<=20)。
Output
对于每组输入N,M,输出一行,该行有一个数,为C(N, M)值。
Sample Input
2
3 5
1 20
Sample Output
10
20
C(N,M) C(5,3)=10,C(3,5)=0
当M>N,应该是M的阶乘除以N的阶乘 M*(M-1)*(M-2)…/N*(N-1)*…1
当M=N,应为1
当M<N,应为0
代码:
#include <stdio.h>
int combine(int n, int m)
{
int sum = 1, N = 1;
for (int i = m; i >= n; i--)
{
if (n >= N)
{
sum = sum*i/N; //N最大只能到n,同时也控制了分子M
N++; //分母用N控制,分子i控制 (m-n) ,m>=n
}
}
return sum;
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
int m, n;
scanf("%d %d", &n, &m);
if (m > n)
printf("%d\n", combine(n, m));
else if (m == n)
printf("1\n");
else
printf("0\n");
}
return 0;
}