
递推 复杂度 $ O(n^{2}) $
总体复杂度 $ 2000^{2} = 4 \times 10^{6} $
点击查看代码
#include<iostream>
using namespace std;
const int N = 2e3 + 10, mod = 1e9 + 7;
int c[N][N];
void init()
{
c[0][0] = 1;
for (int i = 1; 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()
{
int n;
cin >> n;
init();
while (n --) {
int a, b;
cin >> a >> b;
printf("%d\n", c[a][b]);
}
return 0;
}
- 组合数通项公式 $ C_m^{n} = \frac{m!}{n! (m - n)!} $
- 组合数递推公式 $ C_m^{n} = C_{m - 1}^{n - 1} + C_{m - 1}^{n} $
证明:从 $ m $ 个不同的数中取 $ n $ 个,第 $ m $ 个数如果取的话有 $ C_{m - 1}^{n - 1} $ 种取法 ,如果不取有 $ C_{m - 1}^{n} $ 种取法;
- 先计算出来所有的组合数,每次求 $ C_{a}^{b} $ 只需要访问即可, $ C_{m}^{0} = 1 \ (m = 0, 1, 2 \cdots)$ ;