容斥 × DP 完全指南:从底层手法到工具系统(含斯特林数专题与练习题集)
这篇文章是我一段时间以来对「容斥原理及其周边技术」的系统整理。它不只罗列公式,而是试图回答两个问题:这些技术之间是什么关系?面对新题时如何选工具?
全文分五部分:底层翻译手法 → 核心工具四件套 → 扩展工具箱 → 斯特林数专题 → 练习题集。建议先读第〇部分的全景图,再按需跳读。
〇、全景图:三层结构
Layer 0 手法层(翻译层)——把"算不动的量"翻译成"算得动的量"
├── A 乘积 → 标记/见证(下降幂、pointing 算子 xF')
├── B 统计量 → 指标和 + 交换求和序(min 易 / max 难)
└── C 约束 → 规范事件
├── C1 前缀差分(链上 Möbius)
├── C2 规范块分解(exp / log)
└── C3 第一违例(O(k²) DP)
↓ 实例化 / 系统化
Layer 1 工具层
├── 经典容斥 + DP ← C 的朴素形态
├── 二项式反演 ← C1 在子集序上的推广
├── Min-Max 容斥 ← B 中 "max 难" 的系统化
├── 反射原理 / LGV ← C3 失效(无序)时的带符号路线
├── Möbius 反演 ← C1 在整除序上的推广
└── 生成函数(exp/log) ← C2 的代数载体
↓ 实现
优化层
├── FMT / 子集卷积 / 高维前缀和
├── NTT / 分治 NTT / 牛顿迭代
├── BM + 线性递推
└── Meet-in-the-Middle
一句话总纲:有序用见证,无序用容斥;乘积换标记,约束换规范。
一、Layer 0:三种底层翻译手法
1.1 组合意义:把乘积翻译成"标记"
很多式子有组合意义。比如有 \(n\) 个变量,每次选择一个变量 \(+1\),最后得到 \(a_1,a_2,\dots,a_n\),那么 \(\prod_i a_i\) 就可以表示:对于每个 \(i\),选择一个覆盖它的操作的方案数。
原理:\(\prod_i a_i\) 不是抽象的数,而是"对每个 \(i\),从覆盖它的 \(a_i\) 次操作中选一个见证"的方案数。于是
右边可以先选标记、再填剩余部分,往往直接可算。
小验证(\(n=2\) 个变量、共 \(m\) 次操作,枚举所有操作序列):
推广与连接:
- 一般化:\(\prod_i a_i^{\underline{k_i}}\) = 给 \(i\) 选 \(k_i\) 个互不相同的标记 —— 这正是下降幂的组合意义;
- 生成函数语言:标记一个原子 = pointing 算子 \(xF'(x)\);
- 它解释了后文的核心现象:期望题里 \(E[X^{\underline k}]\) 好算而 \(E[X^k]\) 难算,因为下降幂 = 见证数,普通幂没有直接见证解释,需经斯特林数转基。
卡片:看到乘积/幂次权值 → 想到标记/见证 → 下降幂。
1.2 拆贡献:把统计量翻译成指标和
比如要对所有方案算 \(\sum a_i\) 之和,可以单独对每个 \(a_i\) 算它被算了多少次。比如 \(|x-y|\) 可以被拆成 \(\sum_i [\min(x,y)\le i<\max(x,y)]\),然后对每个 \(i\) 算贡献。
原理:两步走。① 把非线性统计量写成对辅助坐标 \(i\) 的指示变量求和;② 交换求和序,对每个 \(i\) 算贡献。
\(|x-y|\) 的例子即"数轴上第 \(i\) 个间隙被 \((x,y)\) 跨越",由此得经典结论:\(\sum_{x i\})\)。
常用分解清单:
| 统计量 | 指标分解 | 难易 |
|---|---|---|
| \(\min(x,y)\) | \(\sum_i [x>i][y>i]\) | 易(指示相乘,独立友好) |
| \(\max(x,y)\) | \(\sum_i \big(1-[x\le i][y\le i]\big)\) | 需展开 → 引出容斥 |
| \(\lvert x-y\rvert\) | \(\sum_i [\min\le i<\max]\) | 易 |
| \([\gcd(x,y)=1]\) | \(\sum_{d\mid x,\,d\mid y}\mu(d)\) | 数论版指标分解 |
关键观察:\(\min\) 是"交"(指示相乘,天然好算),\(\max\) 是"并"(需要展开容斥)。Min-Max 容斥就是这个不对称的系统化——1.2 是 1.3 和 Min-Max 的动机来源。
1.3 处理约束的三种姿势
C1 前缀差分:算最大值 \(=x\) 的方案数,可以用 \(\le x\) 的减掉 \(\le x-1\) 的。
这是链上的 Möbius 反演;二项式反演是它在子集序上的类比("恰好 \(k\)" vs "至少 \(k\)")。
C2 规范块分解:算连通图数量,可以用总方案数减掉不连通的,而不连通的枚举包含 1 号点的连通块,外面任意连即可。
关键不是"总减不连通"这个说法,而是固定规范代表(含 1 号点的块唯一)使分解不重不漏。
C3 第一违例:给定平面上若干障碍点,算左上走到右下的方案数,可以用总的减掉经过障碍点的,然后枚举第一个经过的障碍点,变成子问题。
\(O(k^2)\) 替代 \(O(2^k)\) 容斥;条件是存在与可达性相容的"第一"(偏序/时间序)。反射原理里的"首次触碰"也是它。
统一洞察(本文核心一句):
面对"存在某个坏/好事件",有两条路线:
- 选唯一见证(第一违例、最小元、含 1 号点的块)→ 无符号、DP/GF 友好,但需要结构(序或唯一性);
- 带符号叠加(容斥、LGV 的 \(\det\))→ 无需序,代价是符号与 \(O(2^k)\)/行列式。
有序用见证,无序用容斥。
1.1 的标记手法是同一哲学的另一面:把权值也变成"见证"来数。
二、Layer 1:核心工具四件套
2.1 经典容斥 + DP
- 最熟的应用:错排数 \(D_n=n!\sum_{i=0}^n\frac{(-1)^i}{i!}\);
- 与 DP 的结合:当"至少包含坏集 \(T\)" 的值只依赖 \(|T|\) 或可分解时,枚举子集/计数后乘组合系数;
- 它正是 1.3 中 C 路线的朴素形态:找不到唯一见证时的默认选择。
2.2 二项式反演
- 语义:\(f\) = "至少",\(g\) = "恰好"。凡是"恰好难、至少易"的场景直接套;
- 它是 C1(前缀差分)在子集偏序上的推广,也是后文斯特林数两条通项公式互推的引擎。
2.3 Min-Max 容斥
期望版本(在随机过程中同样成立,这是它最值钱的形式):
- 动机来自 1.2:\(\min\) 是交(好算),\(\max\) 是并(难算),于是用带符号叠加把 \(\max\) 拆成 \(\min\);
- \(E[\min(T)]\) 通常是几何分布:\(E[\min(T)]=\frac{1}{P(T\text{ 中事件发生})}\);
- 配合高维前缀和(子集和)枚举所有 \(T\),复杂度 \(O(2^n)\) 或 \(O(n2^n)\)。
2.4 反射原理与 LGV 引理
反射原理(C3"首次触碰"的显式化):从 \((0,0)\) 到 \((n,m)\)、全程保持 \(y\le x\) 的单调路计数:
(取 \(n=m\) 即 Catalan 数。)
LGV 引理(相交路族的带符号消去):在 DAG 上,设 \(e(a,b)\) 为 \(a\to b\) 的所有路径权值和,则
当"任何相交路族都能两两交换尾巴"时,相交项对消,行列式 = 不相交路族的(带符号)计数。
- 选择判据(接 1.3):能定义"第一交点/首触"且结构是链 → 反射/C3;交点结构复杂、无自然序 → LGV 用行列式硬消。
三、扩展工具箱
3.1 Möbius 反演(数论版容斥)
它是 C1 在整除偏序上的推广;二项式反演、子集反演、数论反演是同一个 Möbius 反演在不同偏序集上的实例。
模板:线性筛 \(\mu\)
mu[1] = 1;
for (int i = 2; i < N; i++) {
if (!vis[i]) pr[++cnt] = i, mu[i] = -1;
for (int j = 1; j <= cnt && 1LL * i * pr[j] < N; j++) {
vis[i * pr[j]] = 1;
if (i % pr[j] == 0) { mu[i * pr[j]] = 0; break; }
mu[i * pr[j]] = -mu[i];
}
}
模板:Dirichlet 前缀和(整除格上的 zeta 变换,\(O(N\log\log N)\),可视为"整除版 FMT")
for (int j = 1; j <= cnt; j++) // 枚举质数 p
for (int i = 1; i * pr[j] < N; i++)
f[i * pr[j]] += f[i]; // 得到 g(n) = Σ_{d|n} f(d)
// 逆变换(Möbius 变换):同结构反向循环并改为减法
典型应用:互质对计数、GCD 卷积、本原串计数(\(a_n=\sum_{d\mid n}b_d \Rightarrow b_n=\sum_{d\mid n}\mu(n/d)a_d\))。
3.2 生成函数:容斥的代数载体
| 组合操作 | OGF / EGF |
|---|---|
| 标号对象的不相交并(set-of-components) | \(G=\exp C \iff C=\ln G\) |
| 恰好 \(k\) 个组件 | \([y^k]\exp(yA(x))\) |
| 序列构造 | \(\frac{1}{1-A(x)}\) |
- \(\ln/\exp\) 的级数展开本身就是容斥:错排 EGF \(D(x)=\frac{e^{-x}}{1-x}\),分子 \(e^{-x}\) 即容斥符号的来源;
- 实用工具:牛顿迭代求 \(\ln F,\exp F,\sqrt F\),\(O(n\log n)\);OGF↔EGF 的 Borel 变换。
3.3 概率方法:容斥的替代视角
- 指示变量法:\(E[X]=\sum_i P(I_i=1)\),无需容斥即可求期望(1.2 的概率版);
- Wald 等式 / 可选停止定理:马尔可夫停时结构下把复杂过程锚定到初值,\(E[M_T]=E[M_0]\);当过程有良好停时结构时优于 Min-Max,否则 Min-Max 更通用;
- 耦合/占优:不求精确值而求界,用于证明题与近似分析。
3.4 线性代数工具:把组合容斥变成代数对象
| 工具 | 用途 | 与容斥的联系 |
|---|---|---|
| Kirchhoff 矩阵树定理 | 生成树计数 | \(\det(L')\) 本质是边集上的 inclusion-exclusion |
| BEST 定理 | 有向欧拉回路计数 | 矩阵树 + 阶乘修正 |
| Pfaffian | 平面图完美匹配 | \(\mathrm{Pf}(A)^2=\det A\),符号由平面定向决定 |
| Transfer Matrix | 带状/周期结构计数 | 矩阵幂替代容斥求和 |
共同主题:将 \(O(2^n)\) 的带符号枚举压缩为 \(O(n^3)\) 的行列式。
3.5 高级优化技术
| 技术 | 适用场景 | 复杂度 |
|---|---|---|
| 子集卷积(FMT + 占位幂级数) | \(h(S)=\sum_{T\subseteq S}f(T)g(S\setminus T)\) 且需记录 $ | T |
| 分治 NTT | 递推核随 \(n\) 变化(如连通图递推、第一类斯特林整行) | \(O(n\log^2 n)\) |
| BM + 线性递推(Kitamasa) | 容斥结果是线性递推序列 | 猜递推后 \(O(k^2\log n)\) |
| Meet-in-the-Middle 容斥 | \(n\approx 40\) | \(O(2^{n/2})\) |
四、斯特林数专题
4.1 第二类斯特林数 \(\begin{Bmatrix}n\\m\end{Bmatrix}\)
定义:\(n\) 个不同球放入 \(m\) 个相同非空盒。递推:\(\begin{Bmatrix}n\\m\end{Bmatrix}=\begin{Bmatrix}n-1\\m-1\end{Bmatrix}+m\begin{Bmatrix}n-1\\m\end{Bmatrix}\)。
通项公式(容斥的直接产物):
推导:乘 \(m!\) 后盒子变不同,即满射个数;容斥"哪些盒子为空"即得。单值 \(\Theta(m)\);整行可写成卷积
幂展开(组合意义显然):
推导:按"实际非空盒数 \(i\)"分类。它与通项公式互为二项式反演对,知一推一。
下降幂桥梁:\(m^n=\sum_i\begin{Bmatrix}n\\i\end{Bmatrix}m^{\underline i}\) 的价值在于 \(m^{\underline i}\) 在求和/差分/期望下行为良好(对应 1.1 的"见证"解释),这是期望题的核心转基操作。
EGF:\(\sum_n\begin{Bmatrix}n\\m\end{Bmatrix}\frac{x^n}{n!}=\frac{(e^x-1)^m}{m!}\)(非空集合的 EGF 是 \(e^x-1\),set-of 构造取 \(\exp\))。
4.2 第一类斯特林数 \(\begin{bmatrix}n\\m\end{bmatrix}\)
定义:\(n\) 个不同元素排成 \(m\) 个非空轮换;由排列的轮换分解,\(\sum_m\begin{bmatrix}n\\m\end{bmatrix}=n!\)。
递推(与第二类对仗,系数差异 = 选集合 vs 插位置):
生成函数(上升幂展开,对应第二类的下降幂):
带符号版本:\(x^{\underline n}=\sum_m s(n,m)x^m\),\(s(n,m)=(-1)^{n-m}\begin{bmatrix}n\\m\end{bmatrix}\)。
EGF(与第二类完美对仗:集合 EGF \(e^x-1\) ↔ 轮换 EGF \(\ln\frac{1}{1-x}\)):
快速计算:
| 目标 | 方法 | 复杂度 |
|---|---|---|
| 整行 \(\begin{bmatrix}n\\0..n\end{bmatrix}\) | 分治 NTT 乘 \(\prod_{i=0}^{n-1}(x+i)\)(或倍增 \(O(n\log n)\)) | \(O(n\log^2 n)\) |
| 整列 | EGF:先求 \(\ln\frac1{1-x}\) 再快速幂 | \(O(n\log n)\) |
实质差异:第二类整行有通项卷积形式(一次 NTT),第一类没有,需分治乘法。
常用特值:\(\begin{bmatrix}n\\1\end{bmatrix}=(n-1)!\),\(\begin{bmatrix}n\\n-1\end{bmatrix}=\binom n2\);随机排列轮换个数期望 \(=H_n\)。
4.3 对偶总览与互逆基变换
| 第二类 | 第一类 | |
|---|---|---|
| 对象 | 集合划分(分堆) | 轮换分解(排队) |
| 递推系数 | \(m\)(选哪个集合) | \(n-1\)(插哪个位置) |
| 基变换 | \(x^n=\sum\begin{Bmatrix}n\\m\end{Bmatrix}x^{\underline m}\) | \(x^{\overline n}=\sum\begin{bmatrix}n\\m\end{bmatrix}x^m\) |
| EGF 原子 | \(e^x-1\) | \(\ln\frac{1}{1-x}\) |
| 整行 | 一次卷积 \(O(n\log n)\) | 分治 \(O(n\log^2 n)\) |
两组三角矩阵(带符号后)互逆:
即"分堆 vs 排队"是同一组合事实的两面,基变换互逆 = 广义反演。
五、笔记组织建议
| 卡片 | 必记内容 |
|---|---|
| 标记法 | \(\prod a_i\) = 见证数;下降幂推广;pointing \(xF'\) |
| 拆贡献 | \(\min/\max/\lvert x-y\rvert/\gcd\) 四格分解表;"min 交易、max 并难" |
| 约束三姿势 | C1 差分式;C2 递推 + exp/log;C3 第一违例递推;判据"有序见证 vs 无序容斥" |
| 四件套 | 容斥公式、二项式反演对、Min-Max(含期望版)、反射/LGV 选择判据 |
| Möbius | \(\mu\) 线性筛 + Dirichlet 前缀和代码 + 三偏序统一表 |
| 第二类 Stirling | 通项(单值/整行 NTT)、幂展开、下降幂桥梁 |
| 第一类 Stirling | 上升幂、EGF、整行分治、特值 \(H_n\) |
附录:练习题集(按知识点分组,附一句话提示)
A. 拆贡献 / 交换求和序(对应 1.2)
| 题目 | 提示 |
|---|---|
| 洛谷 P1966 [NOIP2013] 火柴排队 ★★ | 展开 \(\sum(a_i-b_i)^2\),排序不等式定序;答案化为逆序对数——"对每对 \((i,j)\) 算贡献"的交换求和序。 |
| 自拟热身:给定数组,求所有无序对 \(\lvert x-y\rvert\) 之和 ★ | 排序后拆成 \(\sum_i(\#\le i)(\#>i)\),即 1.2 的间隙分解。 |
B. 经典容斥(对应 2.1)
| 题目 | 提示 |
|---|---|
| 洛谷 P1450 [HAOI2008] 硬币购物 ★★★ | 完全背包预处理无限制方案;对 \(2^4\) 个"超限"子集容斥,强制 \(x_i\ge d_i+1\) 后做变量替换。 |
| 基础自证:推导错排数 \(D_n=n!\sum\frac{(-1)^i}{i!}\) ★ | 坏事件 \(A_i\) = 第 \(i\) 位不动,直接套容斥。 |
C. 二项式反演 / 下降幂 / 第二类 Stirling(对应 2.2、4.1)
| 题目 | 提示 |
|---|---|
| CF1278F Cards ★★★★ | 求 \(E[x^k]\):无脑转下降幂 \(x^k=\sum\begin{Bmatrix}k\\j\end{Bmatrix}x^{\underline j}\),\(E[x^{\underline j}]\) 有直接组合解释(选 \(j\) 个见证位置)。 |
| 洛谷 P5395 第二类斯特林数·行 ★★★★ | 通项拆卷积 \(f(i)=\frac{(-1)^i}{i!}\),\(g(j)=\frac{j^n}{j!}\),一次 NTT。 |
D. Min-Max 容斥(对应 2.3)
| 题目 | 提示 |
|---|---|
| 洛谷 P3175 [HAOI2015] 按位或 ★★★★★ | \(E[\max S]=\sum_T(-1)^{\lvert T\rvert-1}E[\min T]\);\(E[\min T]\) 是几何分布,子集概率用高维前缀和/FWT 求。 |
| HDU 4624 Endless Spin(ICPC 2013 南京)★★★★★ | 同上期望版;\(E[\min T]\) 只依赖 \(T\) 的并集概率,配合"按并集 DP"消去重复子集。 |
E. 反射原理 / LGV(对应 2.4)
| 题目 | 提示 |
|---|---|
| 洛谷 P6657 【模板】LGV 引理 ★★★ | 矩阵元 \(e(a_i,b_j)=\binom{\cdot}{\cdot}\),高斯消元求行列式。 |
| 洛谷 P7736 [NOI2021] 路径交点 ★★★★★ | 分层使用 LGV:每层一个行列式,答案 = 各层行列式之积(\(\det(AB)=\det A\det B\) 的组合解释)。 |
F. Möbius 反演(对应 3.1)
| 题目 | 提示 |
|---|---|
| 洛谷 P3455 [POI2007] ZAP-Queries ★★ | 最基础:\([\gcd=1]=\sum_{d\mid\gcd}\mu(d)\) + 数论分块。 |
| 洛谷 P2522 [HAOI2011] Problem b ★★★ | 区间限制用二维前缀容斥拆成四个前缀问题;莫反 + 分块 + \(\mu\) 前缀和。 |
| 洛谷 P2257 YY的GCD ★★★★ | 枚举质数后交换求和序,预计算 \(g(T)=\sum_{p\mid T}\mu(T/p)\) 再分块。 |
| 洛谷 P3172 [CQOI2015] 选数 ★★★★ | "gcd 恰好为 \(K\)":先除 \(K\),再对倍数容斥(链上/整除序反演),注意区间短的特殊结构。 |
G. 第一类 Stirling(对应 4.2)
| 题目 | 提示 |
|---|---|
| 洛谷 P5408 第一类斯特林数·行 ★★★★ | \(x^{\overline n}=\prod_{i=0}^{n-1}(x+i)\),分治 NTT(加强:倍增 + 平移 \(O(n\log n)\))。 |
| CF960G Bandit Blues ★★★★★ | 前缀/后缀最大值 ↔ 轮换结构:答案 \(\binom{a+b-2}{a-1}\begin{bmatrix}n-1\\a+b-2\end{bmatrix}\);理解"每个轮换 = 一个固定开头的区间"是关键。 |
H. 生成函数 / 连通分解(对应 3.2、C2)
| 题目 | 提示 |
|---|---|
| 模板自练:有标号连通图计数 ★★★ | \(G(x)=\sum 2^{\binom n2}\frac{x^n}{n!}\),\(C(x)=\ln G(x)\);练 \(\ln\) 板子与"规范块"思想。 |
建议刷题顺序:A → B → F(基础三题)→ C → G → D → E → 其余五星题。每道题先问自己:这题的"坏事件/约束"属于 C1/C2/C3 哪一种?有没有唯一见证可用?

浙公网安备 33010602011771号