注解
1、求组合数。因为数量小,不超过30,因此用int就足够。
2、如果用阶乘,要用BigInteger。
3、用递推关系,C(n, m) = C(n-1, m) + C(n-1, m-1)。计算简单!
4、如果是大数求组合数或者取模,要用快速幂(求阶乘)和Lucas定理。
代码
#include <iostream>
#include <string.h>
using namespace std;
const int MAX = 31;
int main() {
int c[MAX][MAX];
memset(c, 0, sizeof(c));
for(int i=0; i<MAX; i++){
c[i][0] = 1;
c[i][i] = 1;
}
c[1][1] = 1;
for(int i=2; i<MAX; i++){
for(int j=1; j<i; j++){
c[i][j] = c[i-1][j] + c[i-1][j-1];
}
}
int T;
scanf("%d", &T);
for(int i=0; i<T; i++){
int n, m;
scanf("%d %d", &n, &m);
if(n<m){
printf("0\n");
}
else{
printf("%d\n", c[n][m]);
}
}
return 0;
}