分析
-
这一题可以使用组合数的递推公式求解,因为$1 \le b \le a \le 2000$,计算量最大为$2000^2=4 \times 10 ^ 6$,大约四百万的复杂度,完全可以接受。
-
递推公式:$C_a^b = C_{a-1}^{b-1} + C_{a-1}^{b}$。
#include <iostream>
using namespace std;
const int N = 2010, mod = 1e9 + 7;
int c[N][N];
void init() {
for (int i = 0; i < N; i++)
for (int j = 0; j <= i; j++)
if (!j) c[i][j] = 1;
else c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
}
int main() {
init(); // 递推求组合数
int n;
scanf("%d", &n);
while (n--) {
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", c[a][b]);
}
return 0;
}