容斥 × 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\) 次操作中选一个见证"的方案数。于是

\[\sum_{\text{方案}} \prod_i a_i \;=\; \#\{(\text{方案},\ \text{每个 } i \text{ 的一个标记操作})\} \]

右边可以先选标记、再填剩余部分,往往直接可算。

小验证\(n=2\) 个变量、共 \(m\) 次操作,枚举所有操作序列):

\[\sum_{\text{序列}} a_1 a_2 = \underbrace{m(m-1)}_{\text{选两个不同位置作标记}}\cdot \underbrace{2^{m-2}}_{\text{其余随意}} \]

推广与连接

  • 一般化:\(\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\) 算贡献。

\[\sum_{\text{方案}}\sum_i (\cdots) \;=\; \sum_i \sum_{\text{方案}} (\cdots) \]

\(|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\) 的。

\[[\max = x] = [\max\le x]-[\max\le x-1] \]

这是链上的 Möbius 反演;二项式反演是它在子集序上的类比("恰好 \(k\)" vs "至少 \(k\)")。

C2 规范块分解:算连通图数量,可以用总方案数减掉不连通的,而不连通的枚举包含 1 号点的连通块,外面任意连即可。

\[G_n=\sum_{k=1}^{n}\binom{n-1}{k-1}C_k\,G_{n-k}\quad\Longleftrightarrow\quad G(x)=\exp C(x),\ \ C(x)=\ln G(x) \]

关键不是"总减不连通"这个说法,而是固定规范代表(含 1 号点的块唯一)使分解不重不漏。

C3 第一违例:给定平面上若干障碍点,算左上走到右下的方案数,可以用总的减掉经过障碍点的,然后枚举第一个经过的障碍点,变成子问题。

\[f(p)=\mathrm{ways}(s\to p)-\sum_{q\prec p} f(q)\,\mathrm{ways}(q\to p) \]

\(O(k^2)\) 替代 \(O(2^k)\) 容斥;条件是存在与可达性相容的"第一"(偏序/时间序)。反射原理里的"首次触碰"也是它。

统一洞察(本文核心一句)

面对"存在某个坏/好事件",有两条路线:

  1. 选唯一见证(第一违例、最小元、含 1 号点的块)→ 无符号、DP/GF 友好,但需要结构(序或唯一性);
  2. 带符号叠加(容斥、LGV 的 \(\det\))→ 无需序,代价是符号与 \(O(2^k)\)/行列式。

有序用见证,无序用容斥。

1.1 的标记手法是同一哲学的另一面:把权值也变成"见证"来数。


二、Layer 1:核心工具四件套

2.1 经典容斥 + DP

\[\Big|\overline{A_1}\cap\cdots\cap\overline{A_m}\Big|=\sum_{T\subseteq[m]}(-1)^{|T|}\,\Big|\bigcap_{i\in T}A_i\Big| \]

  • 最熟的应用:错排数 \(D_n=n!\sum_{i=0}^n\frac{(-1)^i}{i!}\)
  • 与 DP 的结合:当"至少包含坏集 \(T\)" 的值只依赖 \(|T|\) 或可分解时,枚举子集/计数后乘组合系数;
  • 它正是 1.3 中 C 路线的朴素形态:找不到唯一见证时的默认选择。

2.2 二项式反演

\[f(n)=\sum_{k=0}^{n}\binom{n}{k}g(k)\iff g(n)=\sum_{k=0}^{n}(-1)^{n-k}\binom{n}{k}f(k) \]

  • 语义:\(f\) = "至少",\(g\) = "恰好"。凡是"恰好难、至少易"的场景直接套;
  • 它是 C1(前缀差分)在子集偏序上的推广,也是后文斯特林数两条通项公式互推的引擎。

2.3 Min-Max 容斥

\[\max(S)=\sum_{\emptyset\neq T\subseteq S}(-1)^{|T|-1}\min(T) \]

期望版本(在随机过程中同样成立,这是它最值钱的形式):

\[E[\max(S)]=\sum_{\emptyset\neq T\subseteq S}(-1)^{|T|-1}E[\min(T)] \]

  • 动机来自 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\) 的单调路计数:

\[\binom{n+m}{m}-\binom{n+m}{m-1} \]

(取 \(n=m\) 即 Catalan 数。)

LGV 引理(相交路族的带符号消去):在 DAG 上,设 \(e(a,b)\)\(a\to b\) 的所有路径权值和,则

\[\det\big(e(a_i,b_j)\big)_{i,j}=\sum_{\sigma}\mathrm{sgn}(\sigma)\prod_i e(a_i,b_{\sigma(i)}) \]

当"任何相交路族都能两两交换尾巴"时,相交项对消,行列式 = 不相交路族的(带符号)计数。

  • 选择判据(接 1.3):能定义"第一交点/首触"且结构是链 → 反射/C3;交点结构复杂、无自然序 → LGV 用行列式硬消

三、扩展工具箱

3.1 Möbius 反演(数论版容斥)

\[f(n)=\sum_{d\mid n}g(d)\iff g(n)=\sum_{d\mid n}\mu\!\Big(\frac{n}{d}\Big)f(d),\qquad [\gcd(x,y)=1]=\sum_{d\mid \gcd(x,y)}\mu(d) \]

它是 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!\begin{Bmatrix}n\\m\end{Bmatrix}=\sum_{i=0}^{m}\binom{m}{i}(-1)^i(m-i)^n \]

推导:乘 \(m!\) 后盒子变不同,即满射个数;容斥"哪些盒子为空"即得。单值 \(\Theta(m)\)整行可写成卷积

\[\begin{Bmatrix}n\\m\end{Bmatrix}=\sum_{i=0}^{m}\underbrace{\tfrac{(-1)^i}{i!}}_{f(i)}\cdot\underbrace{\tfrac{(m-i)^n}{(m-i)!}}_{g(m-i)}\ \Rightarrow\ O(n\log n)\ \text{(NTT)} \]

幂展开(组合意义显然)

\[m^n=\sum_{i=0}^{m}\binom{m}{i}\begin{Bmatrix}n\\i\end{Bmatrix}i!\;=\;\sum_{i}\begin{Bmatrix}n\\i\end{Bmatrix}m^{\underline i} \]

推导:按"实际非空盒数 \(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 插位置):

\[\begin{bmatrix}n\\m\end{bmatrix}=\begin{bmatrix}n-1\\m-1\end{bmatrix}+(n-1)\begin{bmatrix}n-1\\m\end{bmatrix} \]

生成函数(上升幂展开,对应第二类的下降幂)

\[x^{\overline n}=x(x+1)\cdots(x+n-1)=\sum_{m=0}^{n}\begin{bmatrix}n\\m\end{bmatrix}x^m \]

带符号版本:\(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}\)):

\[\sum_{n\ge m}\begin{bmatrix}n\\m\end{bmatrix}\frac{x^n}{n!}=\frac{1}{m!}\Big(\ln\frac{1}{1-x}\Big)^m \]

快速计算

目标 方法 复杂度
整行 \(\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)\)

两组三角矩阵(带符号后)互逆:

\[\sum_k (-1)^{n-k}\begin{bmatrix}n\\k\end{bmatrix}\begin{Bmatrix}k\\m\end{Bmatrix}=[n=m] \]

即"分堆 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 哪一种?有没有唯一见证可用?

posted @ 2026-08-07 09:42  飞花阁  阅读(8)  评论(0)    收藏  举报
//雪花飘落效果