组合计数基础知识点简要整理
排列数
定义
\(P_n^m\) 为 \(n\) 个不同元素选出 \(m\) 个排成一列,可以得到不同的排列的数量:
\[P_n^m = \dfrac{n!}{(n-m)!} = \prod\limits_{i=n-m+1}^n i
\]
组合数
定义
\(C_n^m\) 表示从 \(n\) 个不同元素选出 \(m\) 个,组成不同的集合的数量(也可记作 \({n\choose m}\)):
\[C_n^m = \dfrac{n!}{m!(n-m)!} = \dfrac{\prod_{i=n-m+1}^n i}{\prod_{i=1}^m i}
\]
性质
- \(C_{n+m}^n = C_{n+m}^m\)
- \(C_n^m = C_{n-1}^m+C_{n-1}^{m-1}\)
- \(\sum_{i=0}^n C_n^i = 2^n\)
- \(C_n^k = C_n^{k-1} \times \frac{n-k+1}{n}\)
求法
- 使用性质 \(C_n^m = C_{n-1}^m+C_{n-1}^{m-1}\) 递推,计算出 \(n\) 范围以内的所有组合数。复杂度 \(O(n^2)\)。
- 递推出 \(0 \sim n\) 的阶乘及其逆元,那么 \(C_n^m = n! \times (m!)^{-1} \times [(n-m)!]^{-1}\)。复杂度 \(O(n)\)。
- 使用 \(C_n^k = C_n^{k-1} \times \frac{n-k+1}{n}\) 递推出 \(C_n^0 \sim C_n^n\) 的值。复杂度 \(O(n)\)。
- Lucas 定理。见下。
经典问题
多重集排列数
\(n_1\) 个 \(a_1\),\(n_2\) 个 \(a_2\),……,\(n_k\) 个 \(a_k\) 组成的多重集可得的本质不同的排列数为:
\[\dfrac{(\sum_{i=1}^k n_i)!}{\prod_{i=1}^k (n_i!)}
\]
多重集组合数
\(n_1\) 个 \(a_1\),\(n_2\) 个 \(a_2\),……,\(n_k\) 个 \(a_k\) 组成的多重集选出 \(R(\le \min\limits_{1\le i\le n} n_i)\) 个元素,得到的本质不同的多重集数为:
\[{{k-1}\choose{k+R-1}}
\]
二项式定理
\((a+b)^n\) 展开可得:
\[(a+b)^n = \sum\limits_{k=0}^n C_n^k a^k b^{n-k}
\]
Lucas 定理
若 \(p\) 为质数,有:
\[{n\choose m} \equiv {{n\bmod p}\choose {m\bmod p}} \times {{\left\lfloor{n/p}\right\rfloor} \choose {\left\lfloor{m/p}\right\rfloor}} \pmod p
\]
在 \(p\) 不太大时,可以在 \(O(p \log_p n)\) 的时间 求出组合数。
Catalan 数
定义
定义第 \(n\) 个 catalan 数为 \(h(n)\),定义式:
\[h(n) = \dfrac{C_{2n}^n}{n+1}
\]
性质
-
递推式 1:
\[h(n) = \begin{cases}
1 & n\le 1 \\
\sum\limits_{i=0}^{n-1} h(i) \times h(n-i - 1) & \text{otherwise.}
\end{cases}
\]
-
递推式 2:\(h(n) = \frac{4n-2}{n+1}\times h(n-1)\)
-
\(h(n) = C_{2n}^n - C_{2n}^{n+1}\)
经典问题
容斥原理
定义
集合 \(S_1, S_2, \cdots ,S_n\) 的并集为:
\[\left|{\Large\operatorname{\cup}\limits_{i=1}^n} S_i\right| = \sum\limits_{1\le i\le n} |S_i| - \sum\limits_{1\le i\le j\le n} |S_i\cap S_j| + \sum\limits_{1\le i\le j\le k\le n} |S_i\cap S_j\cap S_k| - \cdots + (-1)^{n+1}|\operatorname{\cap}\limits_{i=1}^n S_i|
\]
经典问题
多重集组合数(拓展)
现在讨论上述该问题 \(R\) 无限制的问题。
不考虑 \(n_i\) 的限制,那么等价于从集合 \(\{\infty\cdot a_1, \infty\cdot a_2, \cdots \infty\cdot a_k\}\) 中抽取 \(R\) 个的方案数,答案为 \({k+R-1\choose k-1}\)。
若设 \(f_i\) 为限定 \(n_i+1\) 个元素选 \(a_i\),剩下个元素任意选的方案数。那么方案数为 \({k+R-n_i-2\choose k-1}\)。
设 \(f_{i, j}\) 为限定 \(n_i +1, n_j+1\) 个 \(a_i, a_j\) 选中,剩下任意选的方案数。那么即为 \({k+R-n_i-n_j-3 \choose k-1}\)。
根据容斥原理,并用总方案数减去非法方案数,有:
\[{k+R-1 \choose k-1} - \sum\limits_{1\le i\le k} {k+R-n_i-2 \choose k-1} + \sum\limits_{1\le i\le j\le k} {k+R-n_i-n_j-3\choose k-1} - \cdots +(-1)^k {k+R-\sum_{i=1}^k n_i-(k+1) \choose k-1}
\]
二项式反演
\[g(i) = \sum\limits_{j=1}^i {i\choose j} f(j) \quad \Leftrightarrow \quad f(i) = \sum\limits_{j=1}^i (-1)^{i-j} {i\choose j} g(j)
\]
证明:
将第一个式子代入第二个中:
\[f(i)=\sum\limits_{j=1}^i (-1)^{i-j} {i\choose j} \sum\limits_{k=1}^j {j\choose k} f(k)
\]
设 \(a(i)\) 为 \(f(i)\) 的系数。那么:
\[a(k) = \sum\limits_{j=k}^i (-1)^{i-j} {i\choose j}{j\choose k} \\
= \sum\limits_{j=k}^i (-1)^{i-j} \dfrac{i! j!} {j!(i-j)!k!(j-k)!}\\
= \sum\limits_{j=k}^i (-1)^{i-j} \dfrac{i!} {(i-j)!k!(j-k)!}\\
= \sum\limits_{j=k}^i (-1)^{i-j} \dfrac{(i-k)!} {(i-j)!(j-k)!}\times \dfrac{i!}{k!(i-k)!}\\
= \sum\limits_{j=k}^i (-1)^{i-j} {i-k\choose j-k}{i\choose k}
\]
对于 \(\sum_{j=k}^i (-1)^{i-j} {i-k\choose j-k}\) 其实可以理解为第 \(i-k\) 行的组合数错位相减的结果。如果 \(i-k=0\) 那么这个式子就是 \(1\),但否则由于 \({n\choose m} - {n\choose n-m} = 0\),所以两两抵消后结果为 \(0\)。所以:
\[a(k) = [i=k]\times {i\choose k} = [i=k]\\
f(i) = \sum\limits_{k=1}^i a(k)f(k) = f(i)
\]
于是该式得证。
第一类斯特林数
定义
\(\begin{bmatrix} n \\ k \end{bmatrix}\) 把 \(n\) 个不同元素分成 \(k\) 个非空环排列的方案数。
递推式
考虑此时新插入第 \(n\) 个元素:
- 单独构成一个环:\(\begin{bmatrix} n-1 \\ k-1 \end{bmatrix}\)。
- 插入已有的 \(k\) 个环中。发现本质不同的位置有 \(n-1\) 个,那么方案数:\((n-1)\begin{bmatrix} n-1 \\ k \end{bmatrix}\)。
- 于是:
\[\begin{bmatrix}n \\ k\end{bmatrix} = \begin{bmatrix}n-1\\ k-1\end{bmatrix} + (n-1)\begin{bmatrix}n-1\\ k\end{bmatrix}
\]
生成函数
设第 \(n\) 行的第一类斯特林数的生成函数为 \(f(n) = \sum_{i=0}^n \begin{bmatrix} n \\ i \end{bmatrix} x^i\)。
根据递推式,有:\(f(n+1) = f(n)\times (n+x)\)。
于是:\(f(n) = \prod\limits_{i=0}^{n-1} (x+i) = x^{\overline{n}}\)。
性质
根据生成函数,有:
\[x^{\overline{n}} = \sum_{i=0}^{n} \begin{bmatrix} n\\i \end{bmatrix} x^i
\]
下降幂形式(\(\prod_{i-0}^{n-1}(x+i) \to \prod_{i-0}^{n-1}(x-i)\)):
\[x^{\underline{n}} = \sum\limits_{i=0}^n (-1)^{n-i}\begin{bmatrix} n\\i \end{bmatrix} x^i
\]
第二类斯特林数
定义
\(\begin{Bmatrix} n\\k \end{Bmatrix}\) 表示把 \(n\) 个不同元素分成 \(k\) 个非空集合的方案数。
两种方案不同当且仅当存在一个集合仅在其中一种方案中出现。
递推式
考虑此时新插入第 \(n\) 个元素:
- 单独组成一个集合:\(\begin{Bmatrix} n-1\\k-1 \end{Bmatrix}\)。
- 插入原有的 \(k\) 个集合之一:\(k\begin{Bmatrix} n-1\\k \end{Bmatrix}\)
- 于是:
\[\begin{Bmatrix} n\\k \end{Bmatrix} = \begin{Bmatrix} n-1\\k-1 \end{Bmatrix} + k\begin{Bmatrix} n-1\\k \end{Bmatrix}
\]
通项公式
我们在原定义上的非空集合加上标号,那么方案数为 \(k!\times\begin{Bmatrix} n\\k \end{Bmatrix}\)。
在上述定义上改为可空集,那么方案数 \(k^n\)。但是可以写成另一种写法——枚举所有集合中非空的个数:
\[k^n = \sum_{i=0}^k {k \choose i} \begin{Bmatrix} n\\i \end{Bmatrix} \times i!
\]
二项式反演后:
\[\begin{Bmatrix} n\\k \end{Bmatrix} = \dfrac{1}{k!}\sum_{i=0}^k (-1)^{k-i} {k\choose i} \times i^n = \sum\limits_{i=0}^k \dfrac{(-1)^{k-i}\times i^n}{(k-i)!\times i!}
\]
性质
与下降幂的关系:
\[x^{n} = \sum\limits_{i=0}^n \begin{Bmatrix} n\\i \end{Bmatrix} x^{\underline{i}}
\]
证明:
显然 \(n=0\) 是成立的。对于其他情况,使用数学归纳法,假设 \(n-1\) 时该式成立——\(x^{\underline{n}} = x\cdot x^{\underline{n-1}} = \sum\limits_{i=1}^{n-1} \begin{Bmatrix} n-1\\i \end{Bmatrix} x \cdot x^{\underline{i}}\)。
由于 \(x^{\underline{n}} \cdot x = i\cdot x^{\underline{n}} + (x-i)\cdot x^{\underline{n}} = i\cdot x^{\underline{n}}+x^{\underline{n+1}}\),那么:
\[\sum\limits_{i=1}^{n-1} \begin{Bmatrix} n-1\\i \end{Bmatrix} x\cdot x^{\underline{i}} \\
= \sum\limits_{i=1}^{n-1}\left(\begin{Bmatrix} n-1\\i \end{Bmatrix} i\cdot x^{\underline{i}} + \begin{Bmatrix} n-1\\i \end{Bmatrix}x^{\underline{i+1}}\right)\\
=\sum\limits_{i=0}^n \left(\begin{Bmatrix}n - 1\\ i - 1 \end{Bmatrix} + i \begin{Bmatrix}n- 1\\ i\end{Bmatrix}\right)x^{\underline i} \\
= \sum\limits_{i=0}^n \begin{Bmatrix} n\\i \end{Bmatrix} x^{\underline i}
\]
转化为上降幂形式:
\[x^n = \sum\limits_{i=0}^n(-1)^{n-i} \begin{Bmatrix} n\\i \end{Bmatrix} x^{\overline i}
\]
斯特林反演
反转公式
\[\sum\limits_{i=j}^n (-1)^{n-i} \begin{bmatrix} n\\i \end{bmatrix} \begin{Bmatrix} i\\j \end{Bmatrix} = \sum\limits_{i=j}^n (-1)^{i-j} \begin{Bmatrix} n\\i \end{Bmatrix} \begin{bmatrix} i\\j \end{bmatrix} = [n=j]
\]
证明:
由上文得:
\[x^n = \sum\limits_{i=0}^n \begin{Bmatrix} n\\i \end{Bmatrix} x^{\underline i}, \quad x^{\underline{n}} = \sum\limits_{i=0}^n (-1)^{n-i}\begin{bmatrix} n\\i \end{bmatrix} x^i
\]
将第二个代到第一个式子里面:
\[x^{\underline{n}} =\sum\limits_{i=0}^n (-1)^{n-i}\begin{bmatrix} n\\i \end{bmatrix} \left(\sum\limits_{j=0}^i \begin{Bmatrix} i\\ j \end{Bmatrix}x^{\underline{j}} \right)\\
= \sum\limits_{j=0}^n x_j \left( \sum\limits_{i=j}^n (-1)^{n-i} \begin{bmatrix} n\\i \end{bmatrix} \begin{Bmatrix} i\\j \end{Bmatrix} \right)
\]
把最后的式子和 \(x^{\underline{n}}\) 比对一下,发现 \(\sum\limits_{i=j}^n (-1)^{n-i} \begin{bmatrix} n\\i \end{bmatrix} \begin{Bmatrix} i\\j \end{Bmatrix} = [n=j]\)。
同样的,将上面的式子从第一个代入第二个,会有:
\[x^n = \sum\limits_{j=0}^n x^j \left(\sum\limits_{i=j}^n (-1)^{i-j} \begin{Bmatrix} n\\j \end{Bmatrix} \begin{bmatrix} i\\j \end{bmatrix} \right) = \sum\limits_{j=0}^n x^j[n=j]
\]
得到反转公式:
\[\sum\limits_{i=j}^n (-1)^{n-i} \begin{bmatrix} n\\i \end{bmatrix} \begin{Bmatrix} i\\j \end{Bmatrix} = \sum\limits_{i=j}^n (-1)^{i-j} \begin{Bmatrix} n\\i \end{Bmatrix} \begin{bmatrix} i\\j \end{bmatrix} = [n=j]
\]
反演公式
\[g(n) = \sum\limits_{i=0}^n \begin{Bmatrix} n\\ i \end{Bmatrix} f(i) \quad \Leftrightarrow \quad f(n)= \ \sum\limits_{i=0}^n (-1)^{n-i}\begin{bmatrix} n\\ i \end{bmatrix} g(i)
\]
证明:
若已知:
\[f(n)= \ \sum\limits_{i=0}^n (-1)^{n-i}\begin{bmatrix} n\\ i \end{bmatrix} g(i)
\]
那么:
\[g(n) = \sum\limits_{i=0}^n[i=n] g(i)\\
= \sum\limits_{i=0}^n \sum\limits_{j=i}^n (-1)^{j-i} \begin{Bmatrix}n\\ j\end{Bmatrix} \begin{bmatrix}j\\ i\end{bmatrix} g(i)\\
= \sum\limits_{j=0}^n \begin{Bmatrix}n\\ j\end{Bmatrix} \sum\limits_{i=0}^j (-1)^{j-i} \begin{bmatrix}j\\ i\end{bmatrix} g(i)\\
= \sum\limits_{j=0}^n \begin{Bmatrix} n\\ j \end{Bmatrix} f(j)
\]
于是其中一个得证,另一个反着做即可。
后记