容斥与反演
由于笔者数学很菜,本文可能包含一些不严谨/错误之处,向大家道歉。
容斥和反演本质相同,都是通过赋系数来修正贡献的方法。
依据个人习惯,简单的容斥称为差分/单步容斥,升维称为多步容斥,采用单步容斥+递推 / 提取系数积。
常见的证明方式:考虑 \(g_a\to g_b\) 的贡献,反演也可向左/右分别代入化简。然而构造系数时并非如此,往往用已知式子 / 推理 / 猜系数 / 使用 GF 求出。
反演:有列向量 \(f,g\),下标是集合 \(A\),现有下标是集合 \(A\) 的可逆方阵 \(M\),\(M_{i,j}\) 即 \(j\) 向 \(i\) 的贡献系数。
转置得到另一种形式。由于 \((M^T)^{-1}=(M^{-1})^T\):
列向量可以是项数有限的形式幂级数/集合幂级数,\(g_{i/S}\) 常表示恰好满足 \(i\) 个条件 / \(S\) 中条件的方案数,用 \(f\) 还原 \(g\)。我们只考虑“且”,而不讨论“或”(它容易用总方案数减去不满足任何条件的方案数求出)。
反演本质是矩阵求逆,我们学习特殊的反演是在学习特殊矩阵的逆。
有时不需要反演,只需要使用相关公式推式子,仍习惯性称为反演(如“莫比乌斯反演”“欧拉反演”)。
线路 1
莫比乌斯反演 \(\to\) 子集反演 \(\to\) 二项式反演 \(\to\)(广义)容斥原理 \(\to\)(扩展)\(\min-\max\) 容斥。
莫比乌斯反演
即多重集的子集反演。记 \(\mu(S)=\begin{cases}(-1)^{|S|}&\text{S 中无重复元素}\\0&\text{S 中有重复元素}\end{cases}\),则 \(M_{S,T}=[S\subseteq T],M^{-1}_{S,T}=[S\subseteq T]\mu(T-S)\),\(S,T\in\) 集族 \(\mathcal A\),要求 \(\forall A,B\in\mathcal A,\forall A\subseteq C\subseteq B,C\in\mathcal A\)。
组合意义:超集和/子集和 \(\to\) 自己。
单步容斥+递推:高维差分 / 狄利克雷前缀/后缀差分。
证明(\(\Rightarrow\)):
作为考虑贡献系数的例子。考虑 \(B\to A\) 的贡献系数:
对于 \(A\not\subseteq B\),\(coef=0\),接下来考虑 \(A\subseteq B\)。令 \(t\) 表示 \(B-A\) 的元素种类数,则 \(\mu(C-A)\neq0\) 时 \(C-A\) 共有 \(2^t\) 种情况,于是:
并未证明 \(\Leftarrow\) 以及转置形式(也许可以类似地证),也并未说明矩阵可逆。
更简洁的证明(\(\Leftrightarrow\)):
令 \(A=M,B=M^{-1}\),证明 \(AB=BA=I\)。
与上一个证明同理:
故 \(AB=BA=I\),说明 \(B=A^{-1}\)。于是 \(\Leftrightarrow\)、转置形式就都有了。
关于数论 & 两个公式
分解质因数,则正整数和可重集一一对应,故集合和数论、集合幂级数和 DGF 有联系。
(此处 \(*\) 为狄利克雷卷积。)
“莫比乌斯反演”:
“欧拉反演”:
子集反演
从多重集简化为不可重的集合,\(M_{S,T}=[S\subseteq T],M^{-1}_{S,T}=[S\subseteq T](-1)^{|T-S|}\)。
例题:P3349 [ZJOI2016] 小星星、UOJ #37. 【清华集训2014】主旋律。
二项式反演
从不可重集合简化为集合大小,即 \(\mathcal A=2^{\{1,2,\ldots,n\}},A'=\{0,1,2,\ldots,n\},f'_i=\sum_{S\in\mathcal A,|S|=i}f_S,g'_i=\sum_{S\in\mathcal A,|S|=i}g_S\),则 \(M_{i,j}={j\choose i},M^{-1}_{i,j}=(-1)^{j-i}{j\choose i}\)。
组合数的性质框定 \(j\) 的范围:
\(f_i\) 的组合意义:钦定/最多 \(i\) 个元素,注意“钦定”“至多”不同于通常的“至少”“最多”。
单步容斥+递推:
事实上,\(\mathcal A=\{S\mid S\in2^{\{1,2,\ldots,n\}},l\leq|S|\leq r\},A'=\{l,l+1,\ldots,r\}\) 也可。
例题:P4859 已经没有什么好害怕的了、P6478 [NOI Online #2 提高组] 游戏。
(广义)容斥原理
将“钦定”展开为集合:
\(i=0\) 时即为容斥原理。\(f_S\) 沿用子集反演中的定义,表示至少满足 \(S\) 中条件的方案数。
令 \(T_i\) 表示满足第 \(i\) 个条件的情况的集合,则 \(f_S=|\bigcap\limits_{i\in S}T_i|\);特殊地,\(f_\emptyset=|U|\),\(U\) 表示全部情况的集合。也可将 \(T\) 换为概率论中的事件 \(E\),\(|T|\) 换为 \(P(E)\),\(U\) 换为 \(\Omega\),\(P(U)=1\)。
(扩展)\(\min-\max\) 容斥
\(S\neq\emptyset\)。
证明:
可以计算单个元素的贡献系数,但这里使用 Jeefy 学长传授的一种概率论证明方法,它也许更自然。
令 \(S=\{x_1,x_2,\ldots,x_n\},\forall 1\leq i\leq n,x_i\in[0,1]\)。令 \(U\) 为 \([0,1]\) 内的随机变量,记事件 \(A_i=\{U\leq x_i\}\),记 \(g_i\) 表示恰好有 \(i\) 个事件发生的概率,\(f_i\) 表示钦定 \(i\) 个事件发生的概率,\(g_S,f_S\) 同理表示集合 \(S\) 中的事件发生。
根据容斥原理,有:
而我们知道:
于是 \(x_i\in[0,1]\) 时第一个式子成立。对于第二个式子,将 \(x_i\) 改为 \(1-x_i\),得到 \(1-\min x_i\)。\(1-\) 右式得到 \(x_i\),提出右边的 \(1\) 发现 \(\sum_{T\subseteq S,T\neq\emptyset}(-1)^{|T|-1}\cdot1=-(0^{|S|}-1)=1\),故 \(x_i\in[0,1]\) 时第二个式子成立。
可以通过乘非零实数构造每组 \(x_i\) 与真实的集合 \(S\) 的双射,于是 \(x_i\in R\) 时第一、二个式子得证。又由于期望的线性性,第三、四个式子也成立。
扩展:
证明:
我们先给重复的数加减微小值,使得 \(S\) 中的数两两不同,且不影响结果。接着套用广义容斥原理,过程应该与上面类似,来不及写了,咕。
应用:常结合具体意义用于计算期望,也有直接算 \(\min,\max\) 的时候。
线路 2
斯特林反演、集合划分容斥。都是集合划分。
(记得把反转公式放上来。咕。)
斯特林反演
(不会证了,上式存疑,咕)
同样具有转置形式。
组合意义:最多(例如颜色数)/ 至少(例如连通块数)\(\to\) 恰好。
例题:关于颜色那道、P10591 BZOJ4671 异或图。
集合划分容斥
再次大战,终于大致理解。等价是关键。
“等价类”指一个集合及元素的共性(例如值是多少),其中的元素具有某种共性(例如值相同/作为 DAG 的同一层入度为 \(0\) 的点)。一个结构由若干“极大等价类”构成,但我们只能拼“等价类”,于是集合划分容斥给等价类赋合适的系数来等效。
给定极大等价类系数 \(F(x)\)、合并方式 \(G(x)\),求容斥系数 \(H(x)\)。解方程:
求出 \(H(x)\) 后,令 \(f_i/S\) 表示大小为 \(i\) / 集合为 \(S\) 的等价类的方案数,整个结构的 GF 即为:
说明正确性:
- “等价类”表明乘上方案数后容斥结果仍成立,且方案数不变,即求得的是“容斥系数”。具体要求:以 \(G(x)\) 的方式拼出某极大等价类的每种情况(\(\prod\)),方案数之积相同(通常就是 \(\prod1\))。
- 整个结构由极大等价类拼成,最后的 GF 用乘法分配律和乘法交换律“划分”了极大等价类。
可与符号化方法结合使用,且通常需要 \(F(x),G(x)\) 的 \(x^{0/\emptyset}\) 项系数为 \(0\)、\(f_{0/\emptyset}=0\)。(存疑)
扩展:恰好 \(k\) 个极大等价类。升维,添加占位元 \(y\) 表示极大等价类个数,插值即可。
例题:P6846 [CEOI 2019] Amusement Park、AT_abc236_h [ABC236Ex] Distinct Multiples。
线路 3
卷积。单位根反演 \(\to\) 快速卷积(FFT/NTT)\(\to\) 快速高维卷积(FMT/FWT)。
单位根反演
证明:
等比数列求和:
我们知道 \(\omega_n^k=1\) 当且仅当 \(n\mid k\),故原式成立。该结论可用于化简整除/取模/下取整一类的式子。
反演:
矩阵 \(M\) 即为 \(a_j=\omega_n^j \ (0\leq j\leq n-1)\) 的范德蒙德矩阵,这样的范德蒙德矩阵又称为傅里叶矩阵。
证明:
求 \(\sum_{n\geq0}[k\mid n]f_nx^n\):
快速卷积
对下标为集合 \(A=\{0,1,2,\ldots,n-1\}\) 的向量 \(f,g\),定义卷积的贡献方式为:\(f_i\times g_j\to(f*g)_{i\oplus j}\),\(\oplus\) 通常表示 \(+/\operatorname{and}/\operatorname{or}/\operatorname{xor}\)(后三者属于高维卷积),且具有封闭性。
常见的快速卷积:将向量转为“点值”向量(正演:“求值”),“点值”向量做点积,再转回原来的形式(反演:“插值”)。令点值向量 \(F=Mf,G=Mg\),则 \((f*g)=M^{-1}(F\cdot G)\)。于是我们要构造满足条件的可逆矩阵 \(M\),而 FFT/NTT 则用于优化矩阵乘法。
考虑限制(必要条件):
于是令 \(M_{t,i}M_{t,j}=M_{t,i\oplus j}\),利用该条件构造,再检验 \(M\) 是否可逆即可。对于小矩阵可以手动高消求逆;求逆也可找性质。
\(i\oplus j=\min\{i,j\}\)
\(M_{t,i}M_{t,j}=M_{t,\min\{i,j\}}\),乘起来相当于“且”,于是令 \(M_{t,i}=[i\geq t]\) 即可。
正演是后缀和,则反演是后缀差分,即 \(M^{-1}_{i,j}=\begin{cases}1&j=i\\-1&j=i+1\\0&\text{else}\end{cases}\)。
\(i\oplus j=\max\{i,j\}\)
同理,正演是前缀和,反演是前缀差分。
\(i\oplus j=(i+j)\bmod n\)
循环卷积。令 \(M\) 为傅里叶矩阵,则 \(M\) 可逆,且 \(\omega_n\) 的性质使 \(M_{t,i}M_{t,j}=M_{t,(i+j)\bmod n}\)。
FFT/NTT 利用单位根的性质来优化该矩乘。
令 \(F(x)=\sum_{i=0}^{n-1}f_ix^i\),则 \((Mf)_i=F(\omega_n^i)\),那么正演就是多项式多点求值,而反演就是插值。
\(i\oplus j=i+j\)
只需令 \(n\) 足够大,使得 \(\forall f_i\neq0,g_j\neq0,i+j<n\),就是循环卷积。
也可仍使用傅里叶矩阵,但由点值的意义直接得到 \((Mf)_t\cdot(Mg)_t=[M(f*g)]_t\)。
快速高维卷积
通常是集合幂级数的卷积,例如 \(\operatorname{and}/\operatorname{or}/\operatorname{xor}\) 卷积,每个维度独立进行 \(\oplus\) 卷积,再拼到一起(甚至可以让不同维度有不同的 \(\oplus\))。
考虑限制:
- \(M'_{t,i}M'_{t,j}=M'_{t,i\oplus j}\)(\(t,i,j\) 是高维的,\(\oplus\) 表示所有维度的整个卷积)。令 \(M'_{i,j}=\prod_kM_{i_k,j_k}\)(枚举 \(i,j\) 在第 \(k\) 个维度上的值),则我们只对单个维度构造矩阵 \(M\) 即可。
- \(M'\) 可逆。不方便,我们直接倒着做(要倒序枚举维度),乘 \(M\) 的逆矩阵(限制 \(M\) 可逆),这样也保证了结果唯一。
\(\operatorname{and}\) / 高维 \(\operatorname{min}\) 卷积
单个维度 \(\oplus=\min\),FMT/FWT。
\(\operatorname{or}\) / 高维 \(\operatorname{max}\) 卷积
单个维度 \(\oplus=\max\),FMT/FWT。
(\(k\) 进制)\(\operatorname{xor}\) 卷积
单个维度 \(n=k\) 循环卷积(\(k\) 进制),FWT。
FMT
用于快速计算高维前缀/后缀和(正演)、高维前缀/后缀差分(反演),从而快速计算高维的 \(\min/\max\) 卷积。
高维前缀和:按任意顺序依次考虑维度,设 \(s_{i,j}\)(\(i\) 是维度数,\(j\) 是高维的下标)表示前 \(i\) 个维度要求是 \(j\) 的前 \(i\) 个维度形成的可重集的子集,剩余维度要求与 \(j\) 相同的 \(k\) 的 \(\sum f_k\)。扩大 \(i\),在当前维度做前缀和转移即可。
高维前缀差分:倒着 DP 回去(枚举维度的顺序与正演相反)。
FWT
用于快速计算高维卷积。
正演:
-
按任意顺序考虑维度。设 \(s_{i,j}\) 表示 \(k\) 在第 \(>i\) 个维度相同的 \(f_k\) 分一类,对每一类的前 \(i\) 个维度跑正演的结果(\(>i\) 的维度数值不变)。
-
\(i-1\to i\) 转移时,首先枚举“等价类”(第 \(>i\) 个维度相同),再转移等价类内第 \(i\) 维的正演。由于贡献系数(\(M'\))是每一维的 \(\prod\),我们将等价类内第 \(<i\) 个维度相同的所有值写成一个向量,用这一维的矩阵 \(M'\) 乘它得到新的向量,再填回去即可。
-
综合起来:枚举除第 \(i\) 维其他维度的情况,用 \(M'\) 分别乘每组的向量。
反演:
- 倒序处理(枚举维度的顺序与正演相反),乘 \(M^{-1}\)。
也可理解为分治。
- 注意到每维独立,故可以乘不同的 \(M'\),于是可以有不同的 \(\oplus\)。
- 若单维度的卷积是循环卷积/多项式乘法,则可以用 FFT/NTT 优化。
杂项
反射容斥、走回容斥、拉格朗日反演。
参考:
- https://zhuanlan.zhihu.com/p/58665745
- https://www.cnblogs.com/GXZlegend/p/11407185.html
- https://www.luogu.com.cn/article/ov7ptv00
- https://www.cnblogs.com/xiaoziyao/p/17533907.html
- https://yjh965.github.io/post/ji-he-hua-fen-rong-chi-xue-xi-bi-ji/
- https://iodwad.github.io/2022/02/21/set-partition-iep/
- https://www.cnblogs.com/Zaunese/p/18466026
- https://www.cnblogs.com/juju527/p/16541610.html
- https://www.luogu.me/article/ukstuof3
- https://www.cnblogs.com/whisper6/p/17590699.html
- https://www.luogu.com.cn/article/apa4jdbh
2025.8.3&4&5&6 & 2025.9.1
浙公网安备 33010602011771号