组合数学详解

· · 算法·理论

前置:一些定义

  1. $n^{\overline{k}}$ 表示 $n$ 的上升幂,即 $n\times(n+1)\cdots\times(n+k-1)

组合恒等式

常用组合公式

  1. 定义式
C_n^m=\binom{n}{m}=\frac{n!}{m!(n-m)!}=\frac{n^{\underline{m}}}{m!}
  1. 递推式
\binom{n}{m}=\binom{n-1}{m-1}+\binom{n-1}{m}

证明:

相当于从 n 个物品中选择 m 个的方案数,分两种情况。

\binom{n}{m}=\binom{n-1}{m}+\binom{n-1}{m-1}

  1. 对称性
\binom{n}{m}=\binom{n}{n-m}

证明: 使用定义式展开即可。

  1. 吸收/相伴等式
\frac{\binom{n}{m}}{\binom{n-1}{m-1}}=\frac{n}{m} \frac{\binom{n}{m}}{\binom{n-1}{m}}=\frac{n}{n-m} \frac{\binom{n}{m}}{\binom{n}{m-1}}=\frac{n-m+1}{m}

证明: 同样定义式展开即可。

  1. 上指标反转
\binom{r}{k}=(-1)^k\binom{k-r-1}{k}

证明:

\begin{aligned}\binom{r}{k}=\frac{r^{\underline{k}}}{k!}&=\frac{r(r-1)(r-2)\cdots(r-k+1)}{k!}\\&=\frac{(-1)^k(-r)(1-r)\cdots(k-r-1)}{k!}\\&=\frac{(-1)^k(k-r-1)^{\underline{k}}}{k!}\\&=(-1)^k\binom{k-r-1}{k}\end{aligned}
  1. 三项式系数
\binom{n}{m}\binom{m}{k}=\binom{n}{k}\binom{n-k}{m-k}

证明:

\begin{aligned}\binom{n}{m}\binom{m}{k}&=\frac{n!}{(n-m)!(m-k)!k!}\\&=\binom{n}{k}\binom{n-k}{m-k}\end{aligned}
  1. 上指标求和
\sum\limits_{k=0}^n\binom{k}{m}=\binom{n+1}{m+1}

证明:

\binom{n+1}{m+1} 用加法公式一步步展开即可。

  1. 下指标求和
\sum\limits_{i=0}^n\binom{n}{i}=2^n

证明:

n 个物品中取出任意个数物品的方案数,就是大小为 n 的集合的子集个数。

  1. 下指标卷积(范德蒙德卷积)
\sum\limits_{i=0}^n\binom{a}{i}\binom{b}{n-i}=\binom{a+b}{n}

证明:

左边相当于从 a 个物品中选 i 个数的方案数,右边相当于从 b 个物品中选 n-i 个数的方案数,则求和相当于从 a+b 个数中选 n 个数的方案数,即 \binom{a+b}{n}

  1. 上指标卷积
\sum\limits_{i=0}^n\binom{i}{a}\binom{n-i}{b}=\binom{n+1}{a+b+1}

证明:

左式的组合意义为将 n 个物品分为在左右两部分,左边选 a 个,右边选 b 个的方案数,同时等价于插入一个分隔符,共 n+1 个物品选 a+b+1 个的方案数,即 \binom{n+1}{a+b+1}

  1. 平行求和法
\sum\limits_{k=0}^n\binom{r+k}{k}=\binom{r+n+1}{n}

证明:

把右边式子用递推式一直展开即可。

  1. 交错和
\sum\limits_{k=0}^m(-1)^k\binom{n}{k}=(-1)^m\binom{n-1}{m}

证明:

\begin{aligned}\sum\limits_{i=0}^m(-1)^k\binom{n}{k}&=\sum\limits_{i=0}^m\binom{k-n-1}{k}\\&=\binom{m-n}{m}\\&=(-1)^m\binom{n-1}{m}\end{aligned}

例题

  1. 化简
\sum\limits_{k=0}^m\frac{\binom{m}{k}}{\binom{n}{k}}

sol:

注意到 \binom{n}{m}\binom{m}{k}=\binom{n}{k}\binom{n-k}{m-k}

则原式等于:

\begin{aligned}\sum\limits_{k=0}^m\frac{\binom{n-k}{m-k}}{\binom{n}{m}}&=\frac{1}{\binom{n}{m}}\sum\limits_{k=0}^m\binom{n-k}{m-k}\\&=\frac{1}{\binom{n}{m}}\sum\limits_{k=0}^m\binom{n-m+k}{k}\\&=\frac{\binom{n+1}{m}}{\binom{n}{m}}\\&=\frac{n+1}{n+1-m}\end{aligned}
  1. HDU6333
**sol:** 把 $n,m$ 看成区间,使用莫队。 考虑 $n\rightarrow n+1$,$m\rightarrow m+1$ 的变化即可。 3. **化简:** $$\sum\limits_{i=0}^m\binom{n}{i}\binom{m}{i}$$ **sol:** $\begin{aligned}\sum\limits_{i=0}^m\binom{n}{i}\binom{m}{i}&=\sum\limits_{i=0}^m\binom{n}{i}\binom{m}{m-i}\\&=\binom{n+m}{m}\end{aligned}
  1. 化简:
\sum\limits_{i=m}^n(-1)^i\binom{n}{i}\binom{i}{m}

sol:

&=\binom{n}{m}(-1)^m\sum\limits_{i=0}^{n-m}\binom{m-n-1+i}{i}\\&=(-1)^m[n=m]\end{aligned}
  1. 化简:
\sum\limits_{k}\binom{n+k}{2k}\binom{2k}{k}\frac{(-1)^k}{k+1}

sol:

\begin{aligned}\sum\limits_{k}\binom{n+k}{2k}\binom{2k}{k}\frac{(-1)^k}{k+1}&=\sum\limits_{k}\binom{n+k}{k}\binom{n}{k}\frac{(-1)^k}{k+1}\\&=\frac{1}{n+1}\sum\limits_{k}\binom{n+k}{k}\binom{n+1}{k+1}(-1)^k\\&=\frac{1}{n+1}\sum\limits_{k}\binom{-n-1}{k}\binom{n+1}{k+1}\\&=\frac{1}{n+1}\sum\limits_{k}\binom{-n-1}{k}\binom{n+1}{n-k}\\&=\frac{1}{n+1}\binom{0}{n}=[n=0]\end{aligned}
  1. 有标号连通图计数

sol:

f_nn 个点连通图个数,g_nn 个点无向图个数,显然 g_n=2^{\binom{n}{2}}

g_n=\sum\limits_{j=1}^n\binom{n-1}{j-1}f_jg_{n-j}

所以 g_n=\sum\limits_{i=1}^{n-1}\binom{n-1}{j-1}f_jg_{n-j}+f_n

所以 f_n=g_n-\sum\limits_{i=1}^{n-1}\binom{n-1}{j-1}f_jg_{n-j},动态规划即可,复杂度 O(n^2)

鸽巢原理

基本公式

(\sum\limits_{i=1}^np_i)−n+1 个物品放入 n 个盒子,一定存在一个盒子 i,使 得第 i 个盒子至少装了 p_i 个物品。

例题

  1. 有十个数 a_1,a_2\cdots a_{10} 满足 \mathop{\forall}\limits_{1\le i\le 10}1\le a_i\le 60,证明能够从 a_i 中挑出两个交为空的子集,使得它们的和相等。

sol:

首先发现交为空的条件没有用,因为如果找到两个和相等的子集,将它们相交的部分同时去掉,也不影响和相等。

观察到子集总数为 2^{10}=1024 大于和的总数 60\times 10=600,则必有两个子集和相等。

  1. 证明一张有超过 1 个点的简单无向图必定有两点度数相等。

sol:

  1. 证明能从任意 11 个实数中取出 4 个满足:(ac + bd)^2\ge \frac{1}{2}(a^2+b^2)(c^2+d^2)

sol:

显然,存在 6 个实数同号,把这 6 个实数看成 3 个向量,因为这 3 个向量均在第一或第三象限,所以一定存在两个向量夹角小于等于 45 度,利用余弦定理得 \cos 45^\circ\ge \frac{ac+bd}{\sqrt{(a^2+b^2)(c^2+d^2)}},平方得 \frac{1}{2}\ge \frac{(ac+bd)^2}{(a^2+b^2)(c^2+d^2)},变形即可得到原式。

错排

基本公式

f_n 表示长度为 n 的错排个数。

则:

f_n=(n-1)(f_{n-1}+f_{n-2})

例题

  1. 更简单的排列计数

cyc_{\pi} 表示把排列 \pi 看成置换,其中环的个数。

给定 n,k 和多项式 F,对 1\le m\le n 求 $\sum\limits{\pi}F(cyc{\pi})

**sol:** $\begin{aligned}\sum\limits_{\pi}F(cyc_{\pi})&=\sum\limits_{\pi}\sum\limits_{i=0}^{k-1}f_icyc_{\pi}^i\\&=\sum\limits_{\pi}\sum\limits_{i=0}^{k-1}f_i\sum\limits_{j=0}^i\begin{Bmatrix} i \\j \end{Bmatrix}\binom{cyc_{\pi}}{j}j!\\&=\sum\limits_{\pi}\sum\limits_{i=0}^{k-1}\sum\limits_{j=0}^if_i\begin{Bmatrix} i \\j \end{Bmatrix}\binom{cyc_{\pi}}{j}j!\\&=\sum\limits_{\pi}\sum\limits_{j=0}^{k-1}\sum\limits_{i=j}^{k-1}f_i\begin{Bmatrix} i \\j \end{Bmatrix}\binom{cyc_{\pi}}{j}j!\\&=(\sum\limits_{j=0}^{k-1}j!)(\sum\limits_{\pi}\binom{cyc_{\pi}}{j})(\sum\limits_{i=j}^{k-1}f_i\begin{Bmatrix} i \\j \end{Bmatrix})\end{aligned}

c_{t,i} 表示 |\pi|=tcyc_{\pi}=i 的错排 \pi 个数。

考虑递推,设 1 在序列中的位置为 k,分两种情况:

这里其实和错排的递推差不多。

kt-1 种选法,则 c_{t,i}=(t-1)(c_{t-2,i-1}+c_{t-1,i})

又记 p_{t,i} 表示 \sum\limits_{|\pi|=t}\binom{cyc_{\pi}}{i} 的值。

将式子转换为枚举 cyc_{\pi},可得:

\begin{aligned}p_{t,i}&=\sum\limits_{j=1}^t\binom{j}{i}c_{t,j}\\&=\sum\limits_{j=1}^t\binom{j}{i}(t-1)(c_{t-2,j-1}+c_{t-1,j})\\&=(t-1)\sum\limits_{j=1}^t\binom{j}{i}(c_{t-2,j-1}+c_{t-1,j})\\&=(t-1)[\sum\limits_{j=1}^t\binom{j}{i}c_{t-2,j-1}+\sum\limits_{j=1}^t\binom{j}{i}c_{t-1,j}]\\&=(t-1)[\sum\limits_{j=1}^t[\binom{j-1}{i}c_{t-2,j-1}+\binom{j-1}{i-1}c_{t-2,j-1}]+\sum\limits_{j=1}^t\binom{j}{i}c_{t-1,j}]\\&=(t-1)(p_{t-2,i}+p_{t-2,i-1}+p_{t-1,i})\end{aligned}

而由于 t\le n,i<k,则 p 数组可以在 O(nk) 时间复杂度内递推处理。

再看求得的答案式子:

(\sum\limits_{j=0}^{k-1}j!)(\sum\limits_{\pi}\binom{cyc_{\pi}}{j})(\sum\limits_{i=j}^{k-1}f_i\begin{Bmatrix} i \\j \end{Bmatrix})

我们发现:前面一部分和后面一部分可以 O(k^2) 预处理,中间一部分已经被 O(nk) 递推,则枚举要计算的 m,式子就能 O(1) 算了。

容斥原理

基本容斥

对于一个集合 S 的一部分子集构成的簇 P 有:|\mathop{\bigcup}\limits_{T\in P}T| =\sum\limits_{Q\subset P}(−1)^{|Q|−1}|\mathop{\bigcap}\limits_{T\in Q}T|

证明:

考虑每个元素 x,假设它被 k 个元素包含,那么它的贡献就是 \sum\limits_{i=1}^k(-1)^{i-1}\binom{k}{i}

k=0,显然原式等于 0。

k>0,则:

则 $x$ 的贡献为 $[k>0]$,可得原式。 ### $\min/\max$ 容斥 $$\max(S)=\sum\limits_{T\subseteq S}(-1)^{|T|+1}\min(T)$$ $$\max\limits_{kth}(S)=\sum\limits_{T\subseteq S}(-1)^{|T|-k}\binom{|T|-1}{k-1}\min(T)$$ **证明:** $\begin{aligned}\max\limits_{k_{th}}{S}&=\sum\limits_{T\subseteq S}{(-1)^{|T|-k}\dbinom {|T|-1}{k-1}\min T}\\&=\sum\limits_{x\in S}x\sum\limits_{x\in T\subseteq S}{(-1)^{|T|-k}\dbinom {|T|-1}{k-1}[\min{T}=x]}\end{aligned}

f(x) 表示 S 中大于 x 的元素构成的集合。

\begin{aligned}=\sum\limits_{x\in S}{x}\sum\limits_{x\in T\subseteq f(x)}{(-1)^{|T|-k}\dbinom{|T|-1}{k-1}}\end{aligned}

枚举 |T|:

\begin{aligned}&=\sum\limits_{x\in S}{x\sum\limits_{l=1}^{|f(x)|}{(-1)^{l-k}\dbinom{|f(x)|-1}{l-1}\dbinom{l-1}{k-1}}}\\&=\sum\limits_{x\in S}{x\sum\limits_{l=1}^{|f(x)|}{(-1)^{l-k}\dbinom {|f(x)|-1}{k-1}\dbinom{|f(x)|-k}{l-k}}}\\&=\sum\limits_{x\in S}{x\dbinom {|f(x)|-1}{k-1}\sum\limits_{l=1} ^{|f(x)|}{(-1)^{l-k}\dbinom {|f(x)|-k}{l-k}}}\end{aligned}

易知 |f(x)|<k 时无贡献。

\begin{aligned}&=\sum\limits_{x\in S}{x\dbinom {|f(x)|-1}{k-1}\sum\limits_{l=0}^{|f(x)|-k}(-1)^l\dbinom{|f(x)|-k}{l}}\\&=\sum\limits_{x\in S}{x\dbinom {|f(x)|-1}{k-1}[|f(x)|=k]}=\max\limits_{k_{th}}{S}\end{aligned}

例题1

  1. 硬币购物

共有 4 种硬币。面值分别为 c_1,c_2,c_3,c_4

某人去商店买东西,去了 n 次,对于每次购买,他带了 d_ii 种硬币,想购买 s 的价值的东西。请问每次有多少种付款方法。

sol:

A_1,A_2,A_3,A_4 分别为每种硬币取超限的方案数。

则答案为总情况数减去 A_1\cup A_2\cup A_3\cup A_4

显然,总情况数做一个完全背包即可求出。

现在考虑第 1 种硬币超限的方案数,它其实相当于先取 d_1+1 个第 1 种硬币,再对剩下的硬币做一次完全背包。

同理,可以用以上方法算出所有方案数,此题得解。

  1. 卡农

在集合 S=\{1,2,\cdots,n\} 中,选出 m 个无序的互不相同的非空子集,使得每个元素的出现次数均为偶数,求选择方案数。

sol:

f_i 表示选出 i 个集合满足条件的方案数。

先考虑出现次数为偶数的限制:前 i-1 个集合确定了,第 i 个集合也确定了,方案数为 (2^n-1)^{\underline{i-1}}

再减去不满足另外两个限制的方案数:

综上,递推式为 f_i=(2^n-1)^{\underline{i-1}}-f_{i-1}-f_{i-2}(i-1)(2^n-i+1)

  1. 如何正确地排序

给定数列 a,b,c,求 \sum\limits_{i=1}^n\sum\limits_{j=1}^n\max\{a_i+a_j,b_i+b_j,c_i+c_j\}-\min\{a_i+a_j,b_i+b_j,c_i+c_j\}

sol:

考虑 min-max 容斥。

\begin{aligned}\max\{a_i+a_j,b_i+b_j,c_i+c_j\}-\min\{a_i+a_j,b_i+b_j,c_i+c_j\}\end{aligned} \begin{aligned}=a_i+a_j+b_i+b_j+c_i+c_j-\min\{a_i+a_j,b_i+b_j\}-\min\{a_i+a_j,c_i+c_j\}-\min\{b_i+b_j,c_i+c_j\}\end{aligned}

考虑如何求出 \sum\limits_{i=1}^n\sum\limits_{j=1}^n-\min\{a_i+a_j,b_i+b_j\}

把式子变成 (a_i+a_j)[a_i+a_j<b_i+b_j],移一下项可得:(a_i+a_j)[a_i-b_i<b_j-a_j],发现就是一个逆序对,树状数组或二维偏序即可。

  1. Card Collector

n 个元素,每次随机选择一个,有 p_i 的概率选择第 i 个,问所有元素都被选择的期望时间。

sol1:

假设全集为 S,则答案为 E(\max(S))

考虑 min-max 容斥:

而 $E(\min(T))$ 第一次抽出集合 $T$ 中元素的期望时间,显然是 $\frac{1}{\sum\limits_{i\in S}p_i}$。(概率是 $\sum\limits_{i\in S}p_i$,则期望是它的倒数,可证明) **sol2:** 设 $f_S$ 表示现在已经有了集合 $S$ 中的元素,集齐全部的时间期望。 则 $f_{S}=1+(\sum\limits_{i\in S}p_i)f_{S}+(\sum\limits_{i\notin S}p_i)f_{S+\{i\}}$。 化简得 $f_{S}=\frac{1+(\sum\limits_{i\notin S}p_i)f_{S+\{i\}}}{1-\sum\limits_{i\in S}p_i}$,dp 即可。 5. **重返现世** 给 $n$ 个元素,每次随机选择一个,有 $\frac{p_i}{m}$ 的概率选择第 $i$ 个,问第一次有 $k$ 个元素被选择的期望时间。 **sol:** 设全集为 $S$,显然答案为 $E(\max\limits_{kth}(S))$。 由 min-max 容斥: $\begin{aligned}E(\max\limits_{kth}(S))&=\sum\limits_{T\subset S}(-1)^{|T|-k}\binom{|T|-1}{k-1}E(\min(S))\\&=\sum\limits_{T\subset S}(-1)^{|T|-k}\binom{|T|-1}{k-1}\frac{m}{\sum\limits_{i\in T}p_i}\end{aligned}

转为枚举 \frac{m}{\sum\limits_{i\in T}p_i},则答案为:

\sum\limits_{h=0}^m\frac{m}{h}\cdot \sum\limits_{T\subset S\land \sum\limits_{i\in T}p_i=h}(-1)^{|T|-k}\binom{|T|-1}{k-1}

\frac{m}{h} 后面一部分为 f_{n,h},则答案为:\sum\limits_{h=0}^m\frac{m}{h}\cdot f_{n,h}

考虑转移,有两种情况:

不选 n,则贡献为 f_{n-1,h}

n,对于 i,j 这两维,必定分别由 i-1,j-p_i 转移而来,但如果直接转移,转移后的所有 |T| 都比转移前大 1(塞了个 p_i 进去),考虑其影响:

  1. 式子里的 (-1)^{|T|-k} 正负相反,所以应该给转移的 f 取相反数。

  2. 观察 C_{|T|-1}^{k-1},如果 |T| 大 1,它可以拆成 C_{|T|-1}^{k-1} + C_{|T|-1}^{k-2}

把它们综合起来,可得 f_{i,j,k}=f_{i-1,j,k}-f_{i-1,j-p_i,k}+f_{i-1,j-p_i,k-1}

### 二项式反演 #### 基本公式 $$F(n)=\sum\limits_{i=m}^n\binom{n}{i}G(i)\Leftrightarrow G(n)=\sum\limits_{i=m}^n(-1)^{n-i}\binom{n}{i}F(i)$$ $$F(n)=\sum\limits_{i=m}^n\binom{i}{m}G(i)\Leftrightarrow G(n)=\sum\limits_{i=m}^n(-1)^{n-i}\binom{i}{m}F(i)$$ **证明:** 这里只证明第一个,第二个同理。 要证明第一个式子等价于第二个式子,相当于把 $F(n)$ 代入第二个式子后,第二个式子是恒等式。 代入得: $\begin{aligned}G(n)&=\sum\limits_{i=m}^n(-1)^{n-i}\binom{n}{i}\sum\limits_{j=m}^i\binom{i}{j}G(j)\\&=\sum\limits_{i=m}^n\sum\limits_{j=m}^i(-1)^{n-i}\binom{n}{i}\binom{i}{j}G(j)\\&=\sum\limits_{j=m}^n\sum\limits_{i=j}^n(-1)^{n-i}\binom{n}{j}\binom{n-j}{i-j}G(j)\\&=\sum\limits_{j=m}^n\binom{n}{j}\sum\limits_{i=j}^n(-1)^{n-i}\binom{n-j}{i-j}G(j)\\&=\sum\limits_{j=m}^n\binom{n}{j}\sum\limits_{i=0}^{n-j}(-1)^{n-j-i}\binom{n-j}{i}G(j)\\&=\sum\limits_{j=m}^n\binom{n}{j}(1-1)^{n-j}G(j)\\&=\sum\limits_{j=m}^n\binom{n}{j}G(j)[n=j]\\&=\binom{n}{n}G(n)=G(n)\end{aligned}

例题2

  1. 集合计数

一个有 n 个元素的集合,现在要取出此集合的若干子集(至少一个),使得它们的交集的元素个数为 k,求取法的方案数。

sol:

F_i 为答案,G_i 表示「至少」i 个元素是集合的交集,即钦定 i 个元素作为集合的交集,剩余不做限制的方案数,会有重复。

而另外 n−i 个元素都可以选或不选,所以共有 2^{n−i} 个集合,在其中选若干个集合有 2^{2^{n−i}} 种情况,再去掉一个空集,所以是 2^{2^{n−i}}-1 种方案。

G_i=\binom{n}{k}(2^{2^{n-i}}-1)

观察到 G_i=\sum\limits_{j=i}^n\binom{j}{i}F_j。解释一下:我们枚举 j 表示实际交集的元素数,而 G_i 统计了 \binom{j}{i}F_j(从 j 个元素里选出 i 个钦定),所以上式成立。

二项式反演得:

\begin{aligned}F_k&=\sum\limits_{i=k}^n(-1)^{i-k}\binom{i}{k}G_i\\&=\sum\limits_{i=k}^n(-1)^{i-k}\binom{i}{k}\binom{n}{k}(2^{2^{n-i}}-1)\end{aligned}
  1. 已经没有什么好害怕的了

有两个序列 a_i,b_i 保证所有元素互不相同。

你需要重排 b 序列,使得恰好有 ki 满足 a_i>b_i,求方案数。

sol:

先将 a 序列排序。

考虑设 dp_{i,j} 表示考虑了前 i 对数,钦定有 j 对数满足 a_x>b_x

dp_{i,j}=dp_{i-1,j}+dp_{i-1,j-1}\times(cnt_{a_i}-j+1)

设 $f(i)$ 表示钦定 $i$ 对的方案数,$g(i)$ 表示恰好 $i$ 对的方案数。 观察可得:$f_i=(n-i)!dp_{n,i}$。 又有:$f_i=\sum\limits_{j=i}^n\dbinom ji g_j

二项式反演得:g_k=\sum\limits_{i=k} ^n{(-1)^{n-i}\dbinom ik(n-i)!dp_{n,i}}

  1. Sky Full of Stars

有一个 n\times n 的矩阵,将其三染色,使得至少有一行或一列同色,问方案数。

sol:

f_{i,j} 为恰好 ij 列同色的方案数,g_{i,j} 为钦定 ij 列同色的方案数。

显然,g_{i,j} 有四种情况:

观察到:

\begin{aligned}g_{i,j}&=\sum\limits_{k=i}^n\sum\limits_{l=j}^n \binom{k}{i}\binom{l}{j}f_{k,l}\\&=\sum\limits_{k=i}^n\binom{k}{i}\sum\limits_{l=j}^n\binom{l}{j}f_{k,l}\end{aligned}

h_{k,j}=\sum\limits_{l=j}^n\binom{l}{j}f_{k,l},则 g_{i,j}=\sum\limits_{k=i}^n\binom{k}{i}h_{k,j}

二项式反演得:

h_{i,j}=\sum\limits_{k=i}^n\binom{k}{i}(-1)^{n-k}g_{k,j}

h_{i,j}=\sum\limits_{l=j}^n\binom{l}{j}f_{i,l}

二项式反演得:

f_{i,j}=\sum\limits_{l=j}^n(-1)^{n-l}\binom{l}{j}h_{i,l}

h_{i,l} 代入得:

f_{i,j}=\sum\limits_{l=j}^n(-1)^{n-l}\binom{l}{j}\sum\limits_{k=i}^n(-1)^{n-k}\binom{k}{i}g_{k,l}

注意到我们只需要求出 f_{0,0},答案就是总方案数减去 f_{0,0}

所以 f_{0,0}=\sum\limits_{k=0}^n\sum\limits_{l=0}^n(-1)^{l+k}g_{k,l}

g_{k,l} 分类可得:

f_{0,0}=g_{0,0}+\sum\limits_{j=1}^n(-1)^jg_{0,j}+\sum\limits_{i=1}^n(-1)^ig_{i,0}+\sum\limits_{i=1}^n\sum\limits_{j=1}^n(-1)^{i+j}g_{i,j}

其中前三部分都能 O(n) 求出,问题来到第四部分。

\begin{aligned}\sum\limits_{i=1}^n\sum\limits_{j=1}^n(-1)^{i+j}g_{i,j}&=3\sum\limits_{i=1}^n\sum\limits_{j=1}^n(-1)^i(-1)^j\binom{n}{i}\binom{n}{j}3^{(n-i)(n-j)}\\&=3\sum\limits_{i=0}^{n-1}\sum\limits_{j=0}^{n-1}(-1)^i(-1)^j\binom{n}{i}\binom{n}{j}3^{ij}\\&=3\sum\limits_{i=0}^{n-1}(-1)^i\binom{n}{i}\sum\limits_{j=0}^{n-1}(-1)^j3^{ij}\binom{n}{j}\\&=3\sum\limits_{i=0}^{n-1}(-1)^i\binom{n}{i}\sum\limits_{j=0}^{n-1}(-3^i)^j\binom{n}{j}\\&=3\sum\limits_{i=0}^{n-1}(-1)^i\binom{n}{i}[(-3^i+1)^n-(-3^{in})]\end{aligned}

这样就能 O(n) 算出了,此题得解。

特殊数

卡特兰数

斯特林数

第二类斯特林数

第二类斯特林数 \begin{Bmatrix} n \\m \end{Bmatrix} 表示把 n 个不同元素划分成 m 个相同的集合中(不能有空集)的方案数。

求法:

  1. 递推式
\begin{Bmatrix} n \\m \end{Bmatrix}=m\begin{Bmatrix} n-1 \\m \end{Bmatrix}+\begin{Bmatrix} n-1 \\m-1 \end{Bmatrix}

证明:

考虑第 n 个元素放在哪个集合。它要么在已经有的 k 个非空集合里选一个放进去,要么自己单开一个新的集合。

  1. 通项公式
\begin{Bmatrix} n \\m \end{Bmatrix}=\sum\limits_{i=0}^m\frac{(-1)^{m-i}i^n}{i!(m-i)!}

证明:

f_{n,m}=\begin{Bmatrix} n \\m \end{Bmatrix},g_{n,m} 表示允许空集的方案数。

显然,g_{n,m}=\frac{n^m}{m!}

钦定非空集合个数知:

g_{n,m}=\sum\limits_{i=1}^m\binom{m}{i}f_{n,i}

对其二项式反演可得:

f_{n,m}=\sum\limits_{i=1}^m(-1)^{m-i}\binom{m}{i}g_{n,i}

带入 g_{n,i} 可得:

\begin{aligned}\begin{Bmatrix} n \\m \end{Bmatrix}&=f_{n,m}\\&=\sum\limits_{i=1}^m(-1)^{m-i}\binom{m}{i}\frac{m^n}{m!}\\&=\sum\limits_{i=1}^m\frac{(-1)^{m-i}i^n}{i!(m-i)!}\end{aligned}

第一类斯特林数

第一类斯特林数 \begin{bmatrix} n \\k \end{bmatrix} 表示将 n 个元素排成 k 个轮换的方案数。也即所有 n! 个排列中,构成的置换有 k 个环的排列数。

递推式:

{n\brack k}=(n-1){n-1\brack k}+{n-1\brack k-1}

证明:

考虑第 n 个元素放在哪个轮换里。要么在已经有的 k 个轮换里选一个位置插进去,方案数是 n-1;要么自己单开一个新的轮换。

注意:第一类斯特林数无实用通项公式。

基本应用

斯特林数的特殊值
  1. 第二类
{n\brace 0}=[n=0]\ ,\ {n\brace 1}={n\brace n}=1(n>0) {n\brace 2}=2^{n-1}-1(n>0)\ ,\ {n\brace n-1}=\binom{n}{2}
  1. 第一类
{n\brack 0}=[n=0]\ ,\ {n\brack n}=1(n>0) {n\brack 1}=(n-1)!(n>0)\ ,\ {n\brack n-1}=\binom{n}{2}
一些恒等式
{n+1\brace m+1}=\sum\limits_{k}\binom{n}{k}{k\brace m}

证明:

使用组合意义:枚举 k 表示 n+1 号节点所在的集合之外剩下了 k 个节点,这 k 个节点构成了 m 个集合。

{n\brace m}=\sum\limits_k\binom{n}{k}{k+1\brace m+1}(-1)^{n-k}

证明:

把 1 中的式子二项式反演即可。

3.

{m+n+1\brace m}=\sum\limits_{k=0}^mk{n+k\brace k}

证明:

\begin{aligned}\sum\limits_{k=0}^mk{n+k\brace k}&=\sum\limits_{k=0}^m\left({n+k+1\brace k}-{n+k\brace k-1}\right)\\&={m+n+1\brace m}\end{aligned}

同理可得:

{m+n+1\brack m}=\sum\limits_{k=0}^m(n+k){n+k\brack k}
\sum\limits_{k=0}^n{n\brack k}=n!

证明:

一个有 n 个元素的排列和一个 n 个元素的置换一一对应,于是枚举所有置换中的轮换个数,求和即为排列个数 n!

斯特林数与上升幂、下降幂
  1. 普通幂转下降幂 x^n=\sum\limits_{k=0}^n\begin{Bmatrix} n \\k\end{Bmatrix}x^{\underline{k}}=\sum_{k=0}^n{{n\brace k}\binom xkk!}

证明(组合意义):

那么先从 $x$ 个集合中选 $i$ 个,然后再把 $n$ 个元素有序划分为 $i$ 个部分,每个部分依次放进每个集合,组合意义与 $x^n$ 相同。 **证明(代数):** 一个重要的观察:$x^{\underline{k+1}}=x^{\underline{k}}(x-k)$,$x\cdot x^{\underline{k}}=x^{\underline{k+1}}+k\cdot x^{\underline{k}}$。 使用数学归纳法: $\begin{aligned}x\cdot x^{n-1}&=x\cdot \sum\limits_{k=0}^{n-1}{n-1\brace k}x^{\underline{k}}\\&=\sum\limits_{k=0}^{n-1}{n-1\brace k}x^{\underline{k+1}}+\sum\limits_{k=0}^{n-1}{n-1\brace k}k\cdot x^{\underline{k}}\\&=\sum\limits_{k=1}^n{n-1\brace k-1}x^{\underline{k}}+\sum\limits_{k=1}^{n-1}{n-1\brace k}k\cdot x^{\underline{k}}\\&=\sum\limits_{k=1}^n\left(k{n-1\brace k}+{n-1\brace k-1}\right)x^{\underline{k}}\\&=\sum\limits_{k=1}^n{n\brace k}x^{\underline{k}}\end{aligned}

故得证。

  1. 上升幂转普通幂
x^{\overline{n}}=\sum\limits_{i=0}^n{n\brack k}x^k

证明:

同样使用数学归纳法即可。

注意此时的观察为 (x+n-1)x^k=x^{k+1}+(n-1)x^k

  1. 下降幂转普通幂
x^{\underline{n}}=\sum\limits_{k=0}^n(-1)^{n-k}{n\brack k}x^k

证明:

观察可知,上升和下降幂有交错的符号,如:

x^{\underline{4}}=x^4-6x^3+11x^2-6x x^{\overline{4}}=x^4+6x^3+11x^2+6x

则根据上升幂转普通幂公式可得,原式成立。

  1. 普通幂转上升幂
x^n=\sum\limits_{k=0}^n{n\brace k}(-1)^{n-k}x^{\overline{k}}

证明:

x^n=\sum\limits_{k=0}^n{n\brace k}x^{\underline{k}} 中两边带入 -x,得:

(-1)^nx^n=\sum\limits_{k=0}^n{n\brace k}(-x)^{\underline{k}}

同时:

x^{\underline{n}}=(-1)^n(-x)^{\overline{n}}

故得证。

  1. 反转公式
\sum\limits_{k=m}^n{n\brace k}{k\brack m}(-1)^{k-m}=[m=n]

证明:

普通幂转下降幂,再下降幂转普通幂,得到:

x^n=\sum\limits_{k=0}^n{n\brace k}x^{\underline{k}}=\sum\limits_{k=0}^n{n\brace k}\sum\limits_{j=0}^k(-1)^{k-j}{k\brack j}x^j=\sum\limits_{j=0}^n\sum\limits_{k=j}^n{n\brace k}(-1)^{k-j}{k\brack j}x^j

对比两侧多项式的系数,即可得到原式。

类似地,下降幂转普通幂,再普通幂转下降幂,可以得到:

\sum\limits_{k=m}^n{n\brack k}{k\brace m}(-1)^{n-k}=[m=n]
斯特林反演
f(n)=\sum\limits_{k=0}^n{n\brace k}g(k)\Leftrightarrow g(n)=\sum\limits_{k=0}^n(-1)^{n-k}{n\brack k}f(k) f(n)=\sum\limits_{k=m}^n{k\brace m}g(k)\Leftrightarrow g(n)=\sum\limits_{k=m}^n(-1)^{k-m}{k\brack m}f(k)

这里证明第一个式子,与二项式反演相似:

\begin{aligned}f(n)&=\sum\limits_{k=0}^n{n\brace k}\sum\limits_{j=0}^k(-1)^{k-j}{k\brack j}f(j)\\&=\sum\limits_{j=0}^nf(j)\sum\limits_{k=j}^n{n\brace k}{k\brack j}(-1)^{k-j}\\&=\sum\limits_{j=0}^nf(j)[j=n]=f(n)\end{aligned}

故得证。

例题

  1. Team Work

给定 n,k,求:\sum\limits_{i=1}^n\binom{n}{i}i^k

sol:

\begin{aligned}\sum\limits_{i=1}^n\binom{n}{i}i^k&=\sum\limits_{i=0}^n\binom{n}{i}\sum\limits_{j=1}^k{k\brace j}i^{\underline{j}}\\&=\sum\limits_{j=1}^k{k\brace j}j!\sum\limits_{i=0}^n\binom{n}{i}\binom{i}{j}\\&=\sum\limits_{j=1}^k{k\brace j}j!\binom{n}{j}\sum\limits_{i=0}^n\binom{n-j}{i-j}\\&=\sum\limits_{j=1}^k{k\brace j}j!\binom{n}{j}\sum\limits_{i=0}^{n-j}\binom{n-j}{i}\\&=\sum\limits_{j=1}^k{k\brace j}\binom{n}{j}2^{n-j}j!\end{aligned}

预处理斯特林数,即可 O(k^2) 计算。

  1. 组合数问题

给定多项式 f(k)=a_0+a_1k+a_2k^2+\cdots+a_mk^m 以及 n,x,p,求:

\sum\limits_{k=0}^nf(k)x^k\binom{n}{k}

sol:

首先把 f(k) 转下降幂多项式 f(k)=b_0+b_1k^{\underline{1}}+\cdots+b_mk^{\underline{m}}

\sum\limits_{i=0}^ma_ik^i=\sum\limits_{i=0}^ma_i\sum\limits_{j=0}^i{i\brace j}k^{\underline{j}}=\sum\limits_{i=0}^m\left(\sum\limits_{j=i}^m{j\brace i}a_j\right)k^{\underline{i}}

则取 b_i=\sum\limits_{j=i}^m\begin{Bmatrix}j\\i\end{Bmatrix}a_j 即可。

则原式化为:

\sum\limits_{k=0}^n\sum\limits_{i=0}^mb_ik^{\underline{i}}x^k\binom{n}{k}

观察到:

k^{\underline{i}}\binom{n}{k}=n^{\underline{i}}\binom{n-i}{k-i}

带入原式得到:

\begin{aligned}\sum\limits_{k=0}^n\sum\limits_{i=0}^mb_ik^{\underline{i}}x^k\binom{n}{k}&=\sum\limits_{k=0}^n\sum\limits_{i=0}^mb_ix^kn^{\underline{i}}\binom{n-i}{k-i}\\&=\sum\limits_{i=0}^mb_in^{\underline{i}}\sum\limits_{k=0}^n\binom{n-i}{k-i}x^k\\&=\sum\limits_{i=0}^mb_in^{\underline{i}}x^i\sum\limits_{k=0}^{n-i}\binom{n-i}{k}x^k\\&=\sum\limits_{i=0}^mb_in^{\underline{i}}x^i(x+1)^{n-i}\end{aligned}

即可 O(m^2) 计算。

  1. Crash 的文明世界

给定一棵 n 个点的树,以及一个常数 k,对每个 i=1,2,\cdots,n,求:

S(i)=\sum\limits_{j=1}^n\operatorname{dist}(i,j)^k

sol:

利用普通幂转下降幂,原式即为:

\begin{aligned}S(u)&=\sum\limits_{v=1}^n\sum\limits_{i=0}^k{k\brace i}\binom{\operatorname{dist}(u,v)}{i}i!\\&=\sum\limits_{i=0}^k{k\brace i}i!\sum\limits_{v=1}^n\binom{\operatorname{dist}(u,v)}{i}\end{aligned}

考虑使用树形 dp,设 f_{u,i} 表示 u 子树内所有点 v\binom{\operatorname{dist}(u,v)}{i} 之和。

转移方程:

\begin{aligned}f_{u,i}&=\sum\limits_{v\in \operatorname{sub}(u)}\binom{\operatorname{dist}(u,v)}{i}\\&=\sum\limits_{v\in \operatorname{sub}(u)}\left(\binom{\operatorname{dist}(u,v)-1}{i-1}+\binom{\operatorname{dist}(u,v)-1}{i}\right)\\&=\sum\limits_{v\in \operatorname{sub}(u)}f_{v,i-1}+f_{v,i}\end{aligned}

做换根 dp 即可得到每个点的答案。

  1. 幼儿园篮球题

给定 LT 次询问,每次给 n,m,k,求 \sum\limits_{i=0}^k\binom{m}{i}\binom{n-m}{k-i}i^L

sol:

因为 x^L=\sum\limits_{i=0}^x\binom{x}{i}i!\begin{Bmatrix} L \\j \end{Bmatrix}

所以:

\begin{aligned}\sum\limits_{i=0}^k\binom{m}{i}\binom{n-m}{k-i}i^L&=\sum\limits_{i=0}^k\binom{m}{i}\binom{n-m}{k-i}\sum\limits_{j=0}^i\binom{i}{j}j!\begin{Bmatrix} L \\j \end{Bmatrix}\\&=\sum\limits_{j=0}^k\sum\limits_{i=j}^k\binom{m}{i}\binom{n-m}{k-i}\binom{i}{j}j!\begin{Bmatrix} L \\j \end{Bmatrix}\\&=\sum\limits_{j=0}^kj!\begin{Bmatrix} L \\j \end{Bmatrix}\sum\limits_{i=j}^k\binom{m}{i}\binom{n-m}{k-i}\binom{i}{j}\\&=\sum\limits_{j=0}^kj!\begin{Bmatrix} L \\j \end{Bmatrix}\binom{m}{j}\sum\limits_{i=j}^k\binom{m-j}{i-j}\binom{n-m}{k-i}\\&=\sum\limits_{j=0}^kj!\begin{Bmatrix} L \\j \end{Bmatrix}\binom{m}{j}\sum\limits_{i=0}^{k-j}\binom{m-j}{k-i-j}\binom{n-m}{i}\end{aligned}

发现可以使用范德蒙德卷积,化简得:

=\sum\limits_{j=0}^kj!\begin{Bmatrix} L \\j \end{Bmatrix}\binom{m}{j}\binom{n-j}{k-j}

求出一行第二类斯特林数,即可 O(L) 计算。

生成函数

普通生成函数

将数列 \{a_i\} 写成一个函数 F(x)=\sum{a_ix^i} 的形式叫做普通生成函数。

对于生成函数来说,绝大数运算法则都是同平常所说的函数一样的,例如 A(x)+B(x)=\sum\limits{(a_i+b_i)x^i}A(x)B(x)=\sum\limits_i\sum\limits_j(a_ib_j)x^{i+j}

一些常见的数列都可以写作生成函数的形式,而且往往都有较为简单的形式:

注意我们这里的 x 只是一个占位符,我们要关注的是数列 a_i,写成多项式形式的目的是利用多项式的运算帮助我们处理关于 a_i 的操作,并更直观地观察数列的性质。所以多项式的运算对于系数 a_i 都有一定的组合意义,如加法可以代表两个方案数列的加法原理。

例题

  1. 食物

sol:

先计算出每一种食物的生成函数:

两个生成函数 ab 的乘积 c加法卷积

c_k=\sum\limits_{i+j=k}a_ib_j

考虑它的组合意义,假设 a_i 是某种物品取 i 个的方案数(b 同理),那么 cn 次项系数即为对应的两种物品共取 n 个的方案数。

回到原题,显然直接把生成函数乘起来就是答案,化简得到:F(x)=\frac{x}{(x-1)^4}

使用广义二项式定理化简得到:

\begin{aligned}\frac{x}{(x-1)^4}&=x(x-1)^{-4}\\&=x\sum\limits_{i=0}^{\infty}\binom{-4}{i}x^i(-1)^{-4-i}\\&=x\sum\limits_{i=0}^{\infty}\binom{i+3}{i}(-1)^{i}x^i(-1)^{-4-i}\\&=\sum\limits_{i=0}^{\infty}\binom{i+3}{i}x^{i+1} \end{aligned}

题目要求第 n 项的系数,所以把 i+1 换成 n,原式变为 \sum\limits_{n=1}^{\infty}\binom{n+2}{n-1}x^n

显然,第 n 项的系数为 \binom{n+2}{n-1}=\binom{n+2}{3}=\frac{1}{6}n(n+1)(n+2),这就是答案。

指数生成函数

对于数列 \{a_i\},它的指数生成函数 F(x)=\sum{\frac{a_i}{i!}x^i}

常用的指数生成函数: