需要根据组合数问题的数据范围来选择用哪一种方式来实现求组合数
上式的证明:要求从a个苹果里选b个苹果的方案数,首先人为的在a个苹果当中随意标记一个苹果,然后把选法分为两种情况
从a个苹果里选b个苹果的选法中包含这个苹果,以及从a个苹果里选b个苹果的选法中不包含这个苹果
C(a - 1, b - 1) C(a - 1, b)
所有选法一定可以分成这两类,然后根据加法原理,得出上式
根据这个递推式来求
用2000 * 2000的时间复杂度,预处理出来所有的C(a, b)的值
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 2010, mod = 1e9 + 7; 4 int c[N][N]; 5 void init() { 6 for (int i = 0; i < N; i++) { 7 for (int j = 0; j <= i; j++) { 8 if (!j) { //如果j = 0的话,选法只有一种:不选 9 c[i][j] = 1; 10 } else { 11 c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod; 12 } 13 } 14 } 15 } 16 int main() { 17 init(); 18 int n; 19 cin >> n; 20 while (n--) { 21 int a, b; 22 cin >> a >> b; 23 cout << c[a][b] << endl; 24 } 25 return 0; 26 }