AIGC标识 容斥进阶

容斥进阶讲义

承接 容斥原理讲义.md。默认读者已经会:补集容斥、二项式反演、Min-Max 容斥、莫比乌斯反演、SOS DP。
本讲解决三件事:系数不是 \(\pm 1\) 时怎么求;容斥的求和式算不动时怎么用 DP / 多项式压缩;容斥藏在图计数、期望、行列式里时怎么认出来。
建议课时:3 课时(135 分钟)。前置:多项式乘法(NTT)会调用即可,不要求推导。


0. 本讲的地图

节 内容 关键词
1 反演的统一观点 矩阵求逆、EGF、偏序集 Möbius 函数
2 斯特林反演 幂与下降幂互换、自然数幂和
3 单位根反演 下标按模分类求和
4 Min-Max 容斥进阶 kth 版本、系数进 DP、树上期望
5 子集卷积与集合幂级数 连通性容斥、\(O(n^2 2^n)\)
6 图计数中的容斥 连通图、DAG、生成树、二分图
7 容斥 + DP 深入 双射 → 任意映射、多维钦定

1. 反演的统一观点

1.1 矩阵观点

所有反演都是同一件事:\(g = A f\),所以 \(f = A^{-1} g\)。

反演 \(A_{ik}\) \(A^{-1}_{ik}\)
二项式 \(\binom{i}{k}\) \((-1)^{i-k}\binom{i}{k}\)
斯特林 \(S(i,k)\)(第二类) \((-1)^{i-k}s(i,k)\)(第一类,无符号)
莫比乌斯 \([k \mid i]\) \(\mu(i/k)\)
子集 \([T \subseteq S]\) \((-1)^{\lvert S\rvert-\lvert T\rvert}\)

为什么有用:遇到新的"钦定关系"矩阵 \(A\),不用背公式,直接求逆(小规模手算,或用下面的生成函数 / 偏序集视角推)。

1.2 生成函数观点

二项式反演 \(g(n) = \sum_k \binom{n}{k} f(k)\) 等价于指数生成函数(EGF)关系

\[\hat G(x) = \hat F(x)\, e^{x} \iff \hat F(x) = \hat G(x)\, e^{-x} \]

其中 \(\hat F(x) = \sum f(n) x^n / n!\)。

直接后果:一次反演求出所有 \(f(k)\) 只需一次卷积:

\[\frac{f(k)}{k!} \cdot (\text{符号}) = \sum_{i \ge k} \frac{g(i)}{i!}\cdot\frac{(-1)^{i-k}}{(i-k)!} \]

翻转下标后是标准卷积,NTT \(O(n \log n)\)。第 7.3 节会用到。

1.3 偏序集上的 Möbius 函数(Rota)

任意局部有限偏序集 \(P\),定义 \(\zeta(x, y) = [x \le y]\),其逆 \(\mu\) 由下式递归给出:

\[\mu(x, x) = 1,\qquad \mu(x, y) = -\sum_{x \le z < y}\mu(x, z) \]

统一反演定理:

\[g(x) = \sum_{y \le x} f(y) \iff f(x) = \sum_{y \le x}\mu(y, x)\, g(y) \]

各种容斥就是各种偏序集:

偏序集 \(\mu(y, x)\) 对应
链 \(1 < 2 < \cdots\) \(\mu(i, i+1) = -1\),其余 \(0\) 前缀和 ↔ 差分
布尔格(子集) \((-1)^{\lvert x\rvert - \lvert y\rvert}\) 子集反演
整除格 \(\mu(x/y)\) 莫比乌斯反演
乘积偏序 \(P \times Q\) \(\mu_P \cdot \mu_Q\) 多维差分、多重容斥系数相乘

乘积偏序那一行解释了基础讲义 7.4 节 JSOI2015 三层容斥为什么系数直接相乘:行、列、颜色三个布尔格做乘积。

讲课提示:这一节是"内功",不要求学生会证,但要求能对着表格说出"我现在用的是哪个偏序集的 \(\mu\)"。


2. 斯特林反演

2.1 幂、下降幂、上升幂的互换

\[x^n = \sum_{k=0}^{n} S(n,k)\, x^{\underline{k}},\qquad x^{\underline{n}} = \sum_{k=0}^{n} (-1)^{n-k} s(n,k)\, x^{k},\qquad x^{\overline{n}} = \sum_{k=0}^{n} s(n,k)\, x^{k} \]

其中 \(S\) 是第二类斯特林数,\(s\) 是无符号第一类斯特林数,\(x^{\underline{k}} = x(x-1)\cdots(x-k+1)\)。

2.2 反演公式

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

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

证明:把 2.1 的前两式互相代入,得 \(\sum_k S(n,k)(-1)^{k-m}s(k,m) = [n = m]\),即两个矩阵互逆。

2.3 什么时候会遇到

信号是"钦定后的方案数天然带着 \(k!\,S(n,k)\) 或 \(\binom{m}{k}k^n\)"。

  • \(\binom{m}{k} k^n\):钦定 \(k\) 种颜色可用(允许有颜色没用)。用二项式反演。
  • \(k!\, S(n,k)\):\(n\) 个元素满射到 \(k\) 个有标号盒子。它本身就是二项式反演的结果:\(k!\,S(n,k) = \sum_i (-1)^{k-i}\binom{k}{i} i^n\)。
  • \(S(n,k)\):\(n\) 个元素划分成 \(k\) 个无标号非空块。当"块"是无标号的,斯特林反演登场。

2.4 例题 A:自然数幂和(不用伯努利数)

求 \(\sum_{i=0}^{n} i^k\),\(k \le 5000\),\(n \le 10^{18}\)。

\[i^k = \sum_j S(k,j)\, i^{\underline{j}} = \sum_j S(k,j)\, j!\, \binom{i}{j} \]

\[\sum_{i=0}^{n} i^k = \sum_j S(k,j)\, j! \sum_{i=0}^{n}\binom{i}{j} = \sum_{j=0}^{k} S(k,j)\, j!\, \binom{n+1}{j+1} \]

\(O(k^2)\) 预处理 \(S\),\(\binom{n+1}{j+1}\) 用 \(n+1\) 的下降幂逐项算,\(O(k)\)。

验证:\(k=2, n=2\):\(S(2,1)\cdot 1!\cdot\binom{3}{2} + S(2,2)\cdot 2!\cdot\binom{3}{3} = 3 + 2 = 5 = 0+1+4\)。\(\checkmark\)

2.5 例题 B:洛谷 P4827 [国家集训队] Crash 的文明世界

树上每个点 \(u\) 求 \(\sum_i \text{dist}(u,i)^k\),\(n \le 5\times 10^4\),\(k \le 150\)。

用 2.4 的展开:\(\text{dist}^k = \sum_j S(k,j)\,j!\binom{\text{dist}}{j}\)。于是只需对每个 \(u\) 和每个 \(j\) 求 \(\sum_i \binom{\text{dist}(u,i)}{j}\)。

关键:\(\binom{d+1}{j} = \binom{d}{j} + \binom{d}{j-1}\),所以"距离全部加一"对应一次 \(O(k)\) 的转移。树形 DP + 换根,总 \(O(nk)\)。

这道题体现斯特林数的核心用法:把不好做前缀 / 换根的 \(d^k\) 换成好做的 \(\binom{d}{j}\)。

2.6 例题 C:CF 1342E Placing Rooks

\(n \times n\) 棋盘放 \(n\) 个车,使每个格子都被攻击,且恰好有 \(k\) 对车互相攻击。

"每格被攻击" \(\iff\) 每行都有车或每列都有车。设每行都有车(另一种对称)。\(n\) 个车占 \(n\) 行,恰好 \(k\) 对互相攻击 \(\iff\) 恰好用了 \(n - k\) 列。

  • 选哪 \(n-k\) 列:\(\binom{n}{k}\)。
  • \(n\) 行满射到这 \(n-k\) 列:\((n-k)!\,S(n, n-k) = \sum_{i=0}^{n-k}(-1)^i\binom{n-k}{i}(n-k-i)^n\)。

\[\text{ans} = \begin{cases} n! & k = 0 \\ 2\binom{n}{k}\sum_{i=0}^{n-k}(-1)^i\binom{n-k}{i}(n-k-i)^n & 1 \le k < n \\ 0 & k \ge n \end{cases} \]

\(k \ge 1\) 时"每行有车"与"每列有车"不可能同时成立,所以直接乘 2。


3. 单位根反演

3.1 公式

\[[n \mid k] = \frac{1}{n}\sum_{i=0}^{n-1}\omega_n^{ik} \]

证明:\(n \mid k\) 时每项为 1;否则是公比 \(\omega_n^k \ne 1\) 的等比数列,和为 \(\dfrac{\omega_n^{nk}-1}{\omega_n^k - 1} = 0\)。

3.2 用途:下标按模分类求和

\[\sum_{i \equiv r \pmod n} a_i = \frac{1}{n}\sum_{j=0}^{n-1}\omega_n^{-jr}\, A(\omega_n^j),\qquad A(x) = \sum_i a_i x^i \]

当 \(A\) 有闭形式(如 \((1+x)^m\))时,右边只需 \(n\) 次求值,\(O(n \log m)\)。

模意义下:需要 \(n \mid p - 1\),取 \(\omega_n = g^{(p-1)/n}\),\(g\) 是原根。\(998244353 = 119 \cdot 2^{23} + 1\),支持 \(n = 2^k\) 以及 \(7, 17\) 等因子。\(10^9 + 7 = 2 \cdot 500000003 + 1\),几乎只支持 \(n = 2\)。

3.3 例题:洛谷 P5591 LJJ 学二项式定理

求 \(\sum_{i=0}^{n}\binom{n}{i}s^i a_{i \bmod 4}\),\(n \le 10^{18}\),模 \(998244353\)。

\[= \sum_{r=0}^{3} a_r \sum_{i}\binom{n}{i}s^i\,[4 \mid i - r] = \sum_{r=0}^{3} a_r \cdot \frac{1}{4}\sum_{j=0}^{3}\omega_4^{-jr}\,(1 + s\,\omega_4^{j})^n \]

\(\omega_4 = g^{(p-1)/4}\),\(g = 3\)。四次快速幂即可。

3.4 例题:\(\sum_i \binom{n}{i}[3 \mid i]\) 的闭式

\[\frac{1}{3}\sum_{j=0}^{2}(1+\omega_3^j)^n = \frac{2^n + (1+\omega)^n + (1+\omega^2)^n}{3} = \frac{2^n + 2\cos\frac{n\pi}{3}}{3} \]

(\(1+\omega = e^{i\pi/3}\)。)这类题在 \(p = 10^9+7\) 下没有三次单位根,需要在扩域 \(\mathbb{F}_p[\omega]\) 中运算,或改用 \(3 \times 3\) 矩阵快速幂。

3.5 视角:循环卷积

"下标模 \(n\) 分类"等价于长度为 \(n\) 的循环卷积,而单位根反演就是长度 \(n\) 的离散傅里叶变换。这解释了它为什么和 NTT 用同一套单位根。


4. Min-Max 容斥进阶

4.1 第 \(k\) 大的版本

\[\boxed{\;\text{kthmax}(S) = \sum_{\emptyset \ne T \subseteq S}(-1)^{|T|-k}\binom{|T|-1}{k-1}\min(T)\;} \]

证明:设元素从大到小 \(a_1 > a_2 > \cdots > a_n\)。\(a_i\) 作为 \(\min(T)\) 出现,当且仅当 \(T \ni a_i\) 且 \(T \setminus \{a_i\} \subseteq \{a_1, \dots, a_{i-1}\}\)。其系数总和:

\[\sum_{j=0}^{i-1}\binom{i-1}{j}(-1)^{j+1-k}\binom{j}{k-1} = \binom{i-1}{k-1}\sum_{j}(-1)^{j+1-k}\binom{i-k}{j-k+1} = \binom{i-1}{k-1}(1-1)^{i-k} = [i = k] \]

第二步用了 \(\binom{i-1}{j}\binom{j}{k-1} = \binom{i-1}{k-1}\binom{i-k}{j-k+1}\)。\(\blacksquare\)

\(k = 1\) 时退化为普通 Min-Max 容斥。

4.2 系数走 DP:洛谷 P4707 重返现世

题意:\(n\) 种物品,每单位时间以概率 \(p_i / m\) 获得物品 \(i\)(\(\sum p_i = m\))。求集齐任意 \(k\) 种的期望时间。\(n \le 1000\),\(m \le 10^4\),\(n - k + 1 \le 10\)。

分析:设 \(t_i\) 为首次获得物品 \(i\) 的时刻。集齐 \(k\) 种的时刻 \(=\) \(\{t_i\}\) 的第 \(k\) 小 \(=\) 第 \(K\) 大,\(K = n - k + 1 \le 10\)。

\[E[\text{kthmax}] = \sum_T (-1)^{|T|-K}\binom{|T|-1}{K-1}\,E[\min(T)],\qquad E[\min(T)] = \frac{m}{\sum_{i \in T}p_i} \]

\(2^n\) 个 \(T\) 枚举不了,但 \(E[\min(T)]\) 只和 \(p(T) = \sum_{i\in T}p_i \le m\) 有关。把系数塞进 DP,按 \(p(T)\) 分类求和。

记 \(h(T, j) = (-1)^{|T|-j}\binom{|T|-1}{j-1}\)。用 Pascal 公式:

\[h(T \cup \{x\}, j) = h(T, j-1) - h(T, j),\qquad h(\{x\}, j) = [j = 1] \]

定义 \(f[s][j] = \sum_{p(T) = s} h(T, j)\)。放一个哨兵 \(f[0][0] = 1\) 代表空集,它只在 \(j - 1 = 0\) 时被用到(生成单元素集合);\(j = 0\) 这一行永远不更新,保证空集不会被当成真实集合减掉。

// f[s][j],s ∈ [0, m],j ∈ [0, K]
f[0][0] = 1;
for (int i = 1; i <= n; i++)
    for (int s = m; s >= p[i]; s--)
        for (int j = K; j >= 1; j--)
            f[s][j] = (f[s][j] + f[s - p[i]][j - 1] - f[s - p[i]][j] + MOD) % MOD;

ll ans = 0;
for (int s = 1; s <= m; s++)
    ans = (ans + f[s][K] * m % MOD * inv(s)) % MOD;

复杂度 \(O(nmK)\)。

验证递推:\(h(\{x,y\},1) = h(\{x\},0) - h(\{x\},1) = 0 - 1 = -1\),而定义给 \((-1)^{2-1}\binom{1}{0} = -1\)。\(\checkmark\)

讲课提示:这道题的教学价值在于"容斥系数不是常数时,找它的递推,让 DP 顺便把它算出来"。学生要能独立推出 Pascal 那一步。

4.3 树上期望:洛谷 P5643 [PKUWC2018] 随机游走

题意:\(n \le 18\) 的树,从 \(s\) 出发随机游走(每步等概率到邻居)。\(q\) 次询问:给定点集 \(S\),求走遍 \(S\) 中所有点的期望步数。

分析:\(E[\max_{v \in S} t_v] = \sum_{T \subseteq S}(-1)^{|T|-1}E[\min_{v\in T} t_v]\)。

\(E[\min_{v \in T} t_v]\) = 首次到达 \(T\) 中任一点的期望步数。对固定 \(T\),令 \(f(u)\) 为从 \(u\) 出发的期望:\(u \in T\) 时 \(f(u) = 0\),否则

\[f(u) = 1 + \frac{1}{d_u}\Big(f(\text{fa}_u) + \sum_{v \in \text{son}(u)} f(v)\Big) \]

自底向上把 \(f(u)\) 写成 \(f(u) = A_u f(\text{fa}_u) + B_u\)。设儿子 \(v\) 已有 \(f(v) = A_v f(u) + B_v\),代入整理:

\[A_u = \frac{1}{d_u - \sum_v A_v},\qquad B_u = \frac{d_u + \sum_v B_v}{d_u - \sum_v A_v} \]

根节点没有 \(f(\text{fa})\) 项,直接得 \(f(\text{root}) = B_{\text{root}}\)。每个 \(T\) 一次 \(O(n)\) 的树形 DP,共 \(O(n 2^n)\)。

然后令 \(g(T) = (-1)^{|T|-1}E[\min T]\),对 \(g\) 做子集和(SOS DP),每个询问 \(O(1)\)。

4.4 Min-Max 的其他化身

只要"\(\max\) / \(\min\)"在某个格上成立,容斥就成立:

  • lcm / gcd:质因子指数上的 max / min。

    \[\text{lcm}(S) = \prod_{\emptyset \ne T \subseteq S}\gcd(T)^{(-1)^{|T|-1}} \]

  • 按位或 / 按位与:每一位上的 max / min(HAOI2015 按位或的本质)。
  • 集合并 / 交:\(\left|\bigcup\right| = \sum(-1)^{|T|-1}\left|\bigcap\right|\),这就是基本容斥。

5. 子集卷积与集合幂级数

5.1 子集卷积

求 \(h(S) = \sum_{T \subseteq S} f(T)\, g(S \setminus T)\)。直接做是 \(O(3^n)\)。

问题:普通"或卷积"(SOS 正变换后点乘再逆变换)会把 \(T \cup U = S\) 但 \(T \cap U \ne \emptyset\) 的项也算进去。

解决:按集合大小分层,用 \(|T| + |U| = |S|\) 强制不交。

// f, g: 长度 2^n;结果 h
int n; // 元素个数
vector<vector<ll>> F(n + 1, vector<ll>(1 << n)), G = F, H = F;
for (int S = 0; S < (1 << n); S++) {
    F[__builtin_popcount(S)][S] = f[S];
    G[__builtin_popcount(S)][S] = g[S];
}
auto fwt_or = [&](vector<ll>& a, int sign) {   // sign = 1 正变换, -1 逆变换
    for (int j = 0; j < n; j++)
        for (int S = 0; S < (1 << n); S++)
            if (S >> j & 1) a[S] = (a[S] + sign * a[S ^ (1 << j)] + MOD) % MOD;
};
for (int i = 0; i <= n; i++) fwt_or(F[i], 1), fwt_or(G[i], 1);
for (int i = 0; i <= n; i++)
    for (int j = 0; j <= i; j++)
        for (int S = 0; S < (1 << n); S++)
            H[i][S] = (H[i][S] + F[j][S] * G[i - j][S]) % MOD;
for (int i = 0; i <= n; i++) fwt_or(H[i], -1);
for (int S = 0; S < (1 << n); S++) h[S] = H[__builtin_popcount(S)][S];

复杂度 \(O(n^2 2^n)\)。

5.2 连通性容斥:集合幂级数的 \(\ln\) / \(\exp\)

设 \(g(S)\) = 顶点集 \(S\) 上"任意"结构的数量(如 \(2^{e(S)}\),\(e(S)\) 为 \(S\) 内部的边数),\(c(S)\) = 其中连通的数量。

每个任意结构唯一分解为:含 \(\min(S)\) 的那个连通块 \(T\),加上 \(S \setminus T\) 上的任意结构。

\[g(S) = \sum_{T \ni \min(S),\ T \subseteq S} c(T)\, g(S \setminus T) \quad\Longrightarrow\quad c(S) = g(S) - \sum_{\substack{T \subsetneq S\\ T \ni \min(S)}} c(T)\, g(S \setminus T) \]

  • 直接枚举子集:\(O(3^n)\),\(n \le 15\) 可用。
  • 用子集卷积做多项式 \(\ln\):\(O(n^2 2^n)\),\(n \le 21\) 可用。

在生成函数语言里,\(g = \exp(c)\),\(c = \ln g\),其中乘法是子集卷积。

5.3 例题:洛谷 P4221 [WC2018] 州区划分

题意:\(n \le 21\) 个点的图,划分成若干块,每块的导出子图不能有欧拉回路(即不连通或有奇度点)。划分的权值 \(= \prod_i \left(\frac{w(S_i)}{w(S_1 \cup \dots \cup S_i)}\right)^p\),求所有划分的权值和。

分析:

  1. \(O(2^n \cdot n)\) 预处理每个 \(S\) 是否合法(连通 + 全偶度),合法则 \(a(S) = w(S)^p\)。
  2. \(f(S)\) = 把 \(S\) 划分完的权值和:

    \[f(S) = \frac{1}{w(S)^p}\sum_{T \subseteq S,\ T \ni \min(S)} f(S \setminus T)\, a(T) \]

    这是"钦定最小元素所在块"的标准形式,子集卷积 \(O(n^2 2^n)\)。

实现要点:按 popcount 从小到大逐层算 \(f\),每层做一次子集卷积的"第 \(i\) 层",因为 \(f\) 的第 \(i\) 层依赖 \(f\) 的前 \(i - 1\) 层和 \(a\)。


6. 图计数中的容斥

6.1 有标号连通图:洛谷 P4841 [集训队作业2013] 城市规划

\(n\) 个有标号点的无向连通图个数 \(f(n)\)。

任意图数 \(g(n) = 2^{\binom{n}{2}}\)。钦定 1 号点所在连通块大小为 \(k\):

\[f(n) = 2^{\binom{n}{2}} - \sum_{k=1}^{n-1}\binom{n-1}{k-1} f(k)\, 2^{\binom{n-k}{2}} \]

\(O(n^2)\)。EGF 形式 \(\hat F = \ln \hat G\),多项式 \(\ln\) 做到 \(O(n \log n)\)。

验证:\(f(1) = 1, f(2) = 1, f(3) = 4, f(4) = 38\)。

6.2 有标号 DAG 计数

\(n\) 个有标号点的 DAG 个数 \(f(n)\)。

钦定 \(k\) 个点入度为 0(其余点随意,可能也有入度 0)。这 \(k\) 个点向其余 \(n-k\) 个点的边任意:\(2^{k(n-k)}\);其余点构成 DAG:\(f(n-k)\)。"至少一个入度 0 的点"容斥:

\[f(n) = \sum_{k=1}^{n}(-1)^{k+1}\binom{n}{k}2^{k(n-k)}f(n-k),\qquad f(0) = 1 \]

验证:\(f(1) = 1, f(2) = 3, f(3) = 25, f(4) = 543\)。

6.3 有标号二分图(可能不连通)

先数"2-染色图":点分成黑白两色再任意连黑白边,\(C(n) = \sum_k \binom{n}{k}2^{k(n-k)}\)。

每个有 \(c\) 个连通块的二分图被数了 \(2^c\) 次(每块两种染法)。在 EGF 上:\(\hat C = \exp(2\hat B_{\text{conn}})\),于是

\[\hat B = \exp\!\left(\frac{1}{2}\ln \hat C\right) = \sqrt{\hat C} \]

多项式开根一行解决。这是"每个连通块被重复计数常数次 → 取 \(\ln\) 除掉 → \(\exp\) 回去"的模板。

6.4 生成树:CF 917D Stranger Trees

题意:\(n \le 100\),给定树 \(T\),对每个 \(k\) 求有多少棵 \(n\) 个点的生成树恰好与 \(T\) 有 \(k\) 条公共边。

方法一(容斥):\(g(k)\) = 钦定 \(T\) 的某 \(k\) 条边必须在生成树中。这 \(k\) 条边把点集分成 \(c = n - k\) 个连通块,大小 \(a_1, \dots, a_c\)。Cayley 推广:把 \(c\) 个块连成树的方案数为 \(n^{c-2}\prod a_i\)。

\(\prod a_i\) 可以理解为"每块选一个代表点",树形 DP:\(dp[u][j][0/1]\) = 子树 \(u\) 中选了 \(j\) 条边、\(u\) 所在块是否已选代表。\(O(n^2)\) 求出所有 \(g(k)\),再二项式反演。

方法二(矩阵树 + 插值,不用容斥):把 \(T\) 中的边权设为 \(x\),其他边权设为 \(1\)。矩阵树定理给出的行列式是关于 \(x\) 的 \(n-1\) 次多项式,\(x^k\) 的系数恰为答案。取 \(n\) 个不同的 \(x\) 各算一次行列式,拉格朗日插值还原。\(O(n^4)\)。

讲课提示:两种方法都要讲。方法一体现"钦定 → 反演",方法二体现"用变量给对象打标记,把计数问题变成多项式系数",后者在很多题目里更通用。

6.5 网格路径避开障碍:CF 559C Gerald and Giant Chess

\(h \times w\) 网格从左上到右下,\(m \le 2000\) 个障碍格不能经过。

把障碍按 \((x, y)\) 排序,终点作为第 \(m+1\) 个"障碍"。\(f(i)\) = 从起点到障碍 \(i\) 不经过其他障碍的路径数:

\[f(i) = \binom{x_i + y_i - 2}{x_i - 1} - \sum_{j:\ x_j \le x_i,\ y_j \le y_i,\ j \ne i} f(j)\binom{x_i - x_j + y_i - y_j}{x_i - x_j} \]

"钦定第一个经过的障碍是 \(j\)"。\(O(m^2)\)。这是容斥的"第一次"形式:减去按"第一次违反"分类的方案,每个坏方案恰好减一次,不需要正负交错。


7. 容斥 + DP 深入

7.1 系数进 DP 的三种姿势

姿势 做法 例题
转移带 \(-1\) 每"钦定违反"一次乘 \(-1\) 相邻同色段 DP
先 DP 后反演 DP 算出"钦定 \(k\) 个",再二项式反演 BZOJ3622、6.4 方法一
系数自带递推 Pascal 公式进转移 4.2 重返现世

7.2 例题:CF 1228E Another Filling the Grid

\(n \times n\) 网格每格填 \(1..k\),要求每行、每列的最小值都恰好是 1。\(n \le 250\)。

钦定 \(i\) 行 \(j\) 列没有 1(其余随意)。这些行列覆盖 \(n^2 - (n-i)(n-j)\) 个格子,每格 \(k-1\) 种;剩余格子每格 \(k\) 种。

\[\text{ans} = \sum_{i=0}^{n}\sum_{j=0}^{n}(-1)^{i+j}\binom{n}{i}\binom{n}{j}(k-1)^{n^2-(n-i)(n-j)}\,k^{(n-i)(n-j)} \]

\(O(n^2 \log)\),预处理幂后 \(O(n^2)\)。验证 \(n = 1\):\(k - (k-1) - (k-1) + (k-1) = 1\)。\(\checkmark\)

7.3 例题:洛谷 P4491 [HAOI2018] 染色

题意:长 \(n\) 的序列,\(m\) 种颜色。若恰好出现 \(S\) 次的颜色有 \(k\) 种,得分 \(W_k\)。求所有染色方案的得分和。\(n \le 10^7\),\(m \le 10^5\)。

钦定 \(i\) 种颜色恰好出现 \(S\) 次,其余位置随意染其余 \(m - i\) 色:

\[g(i) = \binom{m}{i}\cdot\frac{n!}{(S!)^i\,(n - iS)!}\cdot(m-i)^{n-iS} \]

反演 \(f(k) = \sum_{i \ge k}(-1)^{i-k}\binom{i}{k}g(i)\),用 1.2 节的卷积形式 NTT 一次算出所有 \(f(k)\),答案 \(\sum_k W_k f(k)\)。

7.4 例题:洛谷 P3349 [ZJOI2016] 小星星

题意:树 \(T\) 和图 \(G\) 都有 \(n \le 17\) 个点。求双射 \(\phi: V(T) \to V(G)\) 的个数,使得树的每条边 \((u,v)\) 都满足 \((\phi(u), \phi(v)) \in E(G)\)。

难点:"双射"这个约束让树形 DP 需要记录哪些图点已用,\(O(2^n \cdot n^2)\) 状态之外还要转移,做不动。

容斥去双射:枚举图点子集 \(S\),令 \(f(S)\) = 把树点映射到 \(S\) 中(允许重复)且满足边约束的方案数。这是简单树形 DP:\(dp[u][x]\) = 子树 \(u\) 中 \(u\) 映到 \(x \in S\) 的方案数,\(O(n^3)\) 每个 \(S\)。

映射的像恰好是 \(V(G)\) 的方案数,由子集反演:

\[\text{ans} = \sum_{S \subseteq V(G)}(-1)^{n - |S|} f(S) \]

总 \(O(2^n n^3)\)。

模板化:"双射难,任意映射易" → 枚举像的超集 \(S\),求"像 \(\subseteq S\)"的数量,子集反演得"像 \(= V\)"。所有"每个目标恰好用一次"的约束都可以这样去掉。


8. 常见错误清单(进阶版)

  1. kth Min-Max 的 \(\binom{|T|-1}{k-1}\) 写成 \(\binom{|T|}{k}\)。 上指标是 \(|T| - 1\)。
  2. 单位根反演在 \(10^9+7\) 下用。 该模数几乎没有可用的单位根,需换 \(998244353\) 或扩域。
  3. 斯特林反演符号放错类。 \(S \to s\) 方向的符号 \((-1)^{n-k}\) 跟着第一类 \(s\)。
  4. 子集卷积直接用或卷积。 必须按 popcount 分层,否则相交的 \(T, U\) 被算入。
  5. DAG 计数符号。 是 \((-1)^{k+1}\),\(k = 1\) 项为正。
  6. EGF 反演忘乘 / 除阶乘。 \(f(k)\) 和 \(\dfrac{f(k)}{k!}\) 要分清。
  7. 连通性容斥忘记钦定最小元素。 不钦定会导致每种划分按块数的阶乘重复计数。
  8. 重返现世的 \(j = 0\) 行被更新。 空集哨兵一旦被当成真实集合减掉,系数全错。

9. 课堂练习

  1. 证明 \(\sum_{k}(-1)^{k-m}S(n,k)\,s(k,m) = [n = m]\)。
  2. 写出 \(\sum_i\binom{n}{i}[4 \mid i]\) 的闭式。(答:\(\dfrac{2^n + 2\cdot 2^{n/2}\cos\frac{n\pi}{4}}{4}\))
  3. 手算有标号 DAG 数 \(f(3) = 25\),写出每一项。
  4. 手算有标号连通图数 \(f(4) = 38\)。
  5. 推导 \(\text{lcm}\) 的 Min-Max 容斥式,并解释为什么指数上成立。
  6. 对 4.2 节,验证 \(h(\{x,y,z\}, 2) = 2\) 同时满足定义和递推。
  7. 实现 5.1 的子集卷积,用暴力 \(O(3^n)\) 在 \(n = 10\) 下对拍。
  8. 思考:6.5 的"第一次违反"容斥为什么不需要 \((-1)^{|S|}\)?它对应 1.3 节哪个偏序集?(答:链)

10. 推荐题单

难度 题目 考点
基础 洛谷 P4827 Crash 的文明世界 斯特林数拆幂 + 换根
基础 CF 1342E Placing Rooks 满射计数
基础 洛谷 P5591 LJJ 学二项式定理 单位根反演
基础 CF 559C Gerald and Giant Chess 第一次违反容斥
基础 洛谷 P4841 城市规划 连通图计数
提高 CF 1228E Another Filling the Grid 二维钦定
提高 洛谷 P4491 [HAOI2018] 染色 二项式反演 + NTT
提高 洛谷 P3349 [ZJOI2016] 小星星 双射 → 子集反演
提高 洛谷 P4707 重返现世 kth Min-Max + 系数 DP
提高 洛谷 P5643 [PKUWC2018] 随机游走 Min-Max + 树上消元 + SOS
提高 CF 917D Stranger Trees 生成树容斥 / 矩阵树插值
挑战 洛谷 P4221 [WC2018] 州区划分 子集卷积
挑战 洛谷 P6295 有标号 DAG 计数 DAG 计数 + 多项式
挑战 洛谷 P5748 集合划分计数 集合幂级数 exp
挑战 CF 1034E Little C Loves 3 III 子集卷积技巧

附录:一页纸总结

\[\text{偏序集反演:}\ g(x) = \sum_{y \le x}f(y) \iff f(x) = \sum_{y \le x}\mu(y,x)g(y) \]

\[\text{斯特林反演:}\ f(n) = \sum_k S(n,k)g(k) \iff g(n) = \sum_k(-1)^{n-k}s(n,k)f(k) \]

\[\text{单位根反演:}\ [n \mid k] = \frac{1}{n}\sum_{i=0}^{n-1}\omega_n^{ik} \]

\[\text{kth Min-Max:}\ \text{kthmax}(S) = \sum_{T}(-1)^{|T|-k}\binom{|T|-1}{k-1}\min(T) \]

\[\text{连通性容斥:}\ c(S) = g(S) - \sum_{T \subsetneq S,\ T \ni \min S}c(T)\,g(S \setminus T) \]

\[\text{DAG:}\ f(n) = \sum_{k \ge 1}(-1)^{k+1}\binom{n}{k}2^{k(n-k)}f(n-k),\qquad \text{连通图:}\ f(n) = 2^{\binom n2} - \sum_{k<n}\binom{n-1}{k-1}f(k)2^{\binom{n-k}{2}} \]

思路检查表:系数不是 \(\pm1\) → 找递推或求逆矩阵;\(2^n\) 项算不动 → 按"决定值的量"分类进 DP;"恰好 / 双射 / 连通"→ 换成"钦定 / 任意映射 / 任意" 再反演。

posted @ 2026-09-18 15:50  ylzqwq  阅读(67)  评论(0)    收藏  举报