推荐阅读 NOIp 基础数论知识点总结: https://www.cnblogs.com/greyqz/p/9473370.html
排列组合
\[ \displaystyle C_n^m = C_n^{n-m} \]
\[ \displaystyle \sum_{i=0}^n C_n^i =\sum_{i=0}^nC_n^i1^{i}\times 1^{n-i}=(1 + 1)^n= 2^n \]
\[ \displaystyle C_n^m = \frac{n!}{m!(n-m)!}= \frac{(n-1)!}{m!(n-m-1)!}\times\frac{n}{n-m}=\frac{(n-1)!}{m!(n-m-1)!}\times(1+\frac{m}{n-m})=C_{n-1}^{m}+\frac{(n-1)!}{(m-1)!(n-m)!}= C_{n-1}^m+C_{n-1}^{m-1} \]
\[ \displaystyle \sum_{i=0}^r C_{n+i}^i = C_{n+r+1}^r \]
\[ \displaystyle \sum_{i=0}^n i\times C_n^i =\sum_{i=1}^{n}n\times C_{n-1}^{i-1}=n\sum_{i=0}^{n-1}C_{n-1}^{i-1}= n2^{n-1} \]
\[ \displaystyle C_n^m\times C_m^r=C_n^r\times C_{n-r}^{m-r} \]
\[ \displaystyle C_n^0-C_n^1+C_n^2+\cdots +C_n^m=0 \]
组合数基本处理 \(O(n)\)
const int N = 1e5 + 7, MOD = 1e9 + 7;
int add(int a, int b) { if ((a += b) >= MOD) a -= MOD; return a; }
int mul(int a, int b) { return ll(a) * b % MOD; }
int C(int a, int b) { return mul(jc[a], mul(ijc[a - b], ijc[b])); }
int qpow(int a, int b) {
int r = 1;
for (; b; b >>= 1) {
if (b & 1) r = mul(r, a);
a = mul(a, a);
}
return a;
}
int jc[N], ijc[N];
void ini() {
jc[0] = 1; for (int i = 1; i < N; i++) jc[i] = mul(jc[i - 1], i);
ijc[N - 1] = qpow(jc[N - 1], MOD - 2);
for (int i = N - 2; i >= 0; i--) ijc[i] = mul(ijc[i + 1], i + 1);
}
数学规律
Catalan 数
\[\operatorname{Catalan}(n)=\displaystyle\frac{C_{2n}^n}{n+1}\]