m 層嵌套循環,第 1 層變量從 1 到 n,第 i 層從上一層變量+1 到 n。求最內層 OP 執行次數。m, n ≤ 2000,結果模 1007。
循環變量滿足:1 ≤ i₁ < i₂ < ... < iₘ ≤ n。這正是從 n 個元素中選 m 個的組合數 C(n, m)!
驗證樣例:n=3, m=2 → C(3,2)=3 ✓;n=3, m=1 → C(3,1)=3 ✓
C(n, m) = C(n-1, m) + C(n-1, m-1)。預計算 2000×2000 的 Pascal 三角,模 1007。
#include <cstdio>
const int MAXN = 2000;
const int MOD = 1007;
int C[MAXN + 1][MAXN + 1];
int main() {
// 楊輝三角預計算
for (int i = 0; i <= MAXN; ++i) {
C[i][0] = C[i][i] = 1 % MOD;
for (int j = 1; j < i; ++j)
C[i][j] = (C[i-1][j] + C[i-1][j-1]) % MOD;
}
int T; scanf("%d", &T);
while (T--) {
int m, n; scanf("%d%d", &m, &n);
printf("%d\n", C[n][m]);
}
return 0;
}
更通用的:k 層循環,第 i 層從 a_i 到 b_i,可用生成函數或 DP 求解。本題等差約束使其退化為簡單組合數。