①根据递推公式 c(n,m)=c(n-1,m-1)+c(n-1,m)
#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int N = 66;
ll a[N];
ll conb[N][N];
int main()
{
int t, n, m, i, j;
for (i = 0; i < 65; i++)
conb[i][i] = conb[i][0] = 1;
for(i = 1; i < 65; i++)
for(j = 1; j < i; j++)
conb[i][j] = conb[i-1][j] + conb[i-1][j-1];
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &m);
ll ans = conb[n][m];
printf("%lld\n", ans);
}
return 0;
}
② 根据数学直接计算公式
ll get(int n, int m) //计算组合数C(n,m)
{
ll ans = 1;
if(m > n/2)
m = n-m;
for(int i = 1; i <= m; ++i)
ans = ans*(ll)(n-i+1)/i;
return ans;
}