省选计划1.21
主题:容斥反演。
容斥
求 \(n\) 个集合的并集。
\(S\) 不可为空。
简单证明:
考虑一个元素出现在 \(p_{a_1},p_{a_2},\dots,p_{a_x}\),考虑其的贡献。为 \(\sum\limits_{S\in a}(-1)^{|S|-1}=\sum\limits_{i=1}^{x} (-1)^{i-1}\binom{x}{i}=1+\sum\limits_{i=0}^x (-1)^{i-1}\binom{x}{i}\)。根据二项式定理对其进行变形,\(1-\sum\limits_{i=0}^x(-1)^i\binom{x}{i}=1-(1-1)^x=1\)。
有时候需要求集合的交集,令 \(\overline{A}\) 为 \(A\) 的补集,则 \(\overline{\overline{A}}=A\),\(\overline{\cup\overline{p_i}}=\cap p_i\),令 \(Z\) 为全集,则 \(|\cap p_i|=|Z|-|\cup\overline{p_i}|\)。
注意到在容斥式子中我们给出了 \(S\) 不可为空的限制,因为在大多数题目中,当 \(S\) 为空时可以直接求出 \(|Z|\)。如果可以,那么求交集时会有另一个式子:
\(S\) 可以为空。
不定方程计数。对 \(\sum\limits x_i=S\),\(0\le x_i\le K\),对解计数,\(n,K\le 10^5\)。
将 \(x_i>K\) 作为属性,求集合的并集,然后利用总方案数减去并集大小即可。注意所有方案均需满足 \(0\le x_i,\sum x_i=S\)。如果钦定了 \(i\) 个位置满足 \(x_i>K\),那么直接插板即可,给出答案:
给一张无标号图 \(G\) 和一张有标号树 \(T\),求有多少种给 \(G\) 标号的方式使得 \(T\) 是 \(G\) 的一棵生成树,\(n\le 17\)。
如果一开始就往容斥上想并不好做,考虑一个暴力的做法。
首先给图标号这种事情看上去无从下手,考虑先给图随便标一个号,然后统计有多少种映射合法。令 \(f_{i,j,S}\) 代表 \(T\) 上的 \(i\) 映射到了 \(j\),\(i\) 的子树内的映射到的集合是 \(S\) 的方案数。转移做子树合并。时间复杂度 \(O(n^33^n)\)。
考虑复杂度的瓶颈在于状态中的集合 \(S\),其作用是为了避免重复,尝试用容斥去掉 \(S\) 这个限制。
令 \(g(S)\) 代表 \(T\) 中的所有点不必映射成 \(n\) 阶排列,而是只需映射到 \(S\) 这个集合中即可。那么答案就是 \(\sum\limits_{S}(-1)^{n-|S|}g(S)\),我们将映射后每个点是否被映射到视作属性,那么我们就是要求所有点都被映射到,\(g(S)\) 实际上同样等价于 \(\overline{S}\) 没被映射到的方案数,做容斥即可,这也解释了容斥系数中的 \((-1)^{n-|S|}\) 从何而来。
考虑如何求 \(g(S)\),我们枚举 \(S\),在做 dp 的过程中要求必须填 \(S\) 中的数即可。时间复杂度 \(O(n^32^n)\)。代码。
从暴力 dp 到正解中最关键的一步思考就是将映射成 \(n\) 阶排列这个条件变成所有 \(n\) 个点都被映射到。
不妨考虑能否将 \(g\) 和答案的关系一般化。令 \(f(S)\) 代表映射到的集合恰好为 \(S\) 的方案数,\(g(S)\) 代表映射到的集合为 \(S\) 的子集的方案数,那么显然存在的关系是:
而我们刚才得到了这样的一个式子:
我们断言,任意对于某个集合的函数 \(f,g\),若第一条关系成立,则第二条关系也成立。给出粗略证明:
对于关于集合 \(P\) 的函数 \(F(P)=\sum\limits_{T\in P}(-1)^{|T|-|P|}\),存在 \(F(P)=0^{|P|}\)。
证明
所以 \(f(S)=\sum\limits_{Q\in S}f(Q)\times F(S/Q)=f(S)\)。
实际上,这是子集反演的一种形式。当我们将 \(g\) 看作至多,\(f\) 看作恰好时,这个式子会起很大的作用。
思考
容斥可以对于一些限制,将恰好转变成至少来放宽一些条件,以及后面反演中将涉及的 \(\min\) 和 \(\max\) 的转化。
凑容斥系数
刚才所有的容斥都是利用集合来理解的,考虑如下的理解方式:
要对所有物品在 \(C_0\) 条件下的贡献求和,那么考虑构造一些其它条件 \(C_1,C_2,\dots,C_n\),并且有容斥系数 \(f_1,f_2,\dots,f_n\),设 \(val(C_i)\) 是某个物品在 \(C_i\) 条件下的贡献,那么要有:
如果能构造出 \(C_i\) 和 \(f_i\),同时能求出在每个 \(C_i\) 下的所有物品贡献之和 \(sum_i\),那么就有:
在前文的容斥中,我们都是将 \(C_0\) 视作对所有集合求交,同时容斥系数 \(f_i\in\{-1,1\}\),或者在此基础上做了一些本质区别不大的改变。
错排问题:求 \(p_i\neq i\) 的 \(n\) 阶排列数。
在广义的容斥中,往往很多时候都将一个状态视作物品。在这里,我们将一个 \(n\) 阶排列视作一个物品。
直接的想法是让 \(C_0\) 代表 \(p_i\neq i\),\(C_i\) 代表某一个子集满足 \(p_i\neq i\),这样的话并不能刻画出容斥系数,此时条件之间的运算本质上还是逻辑与。
令 \(C_i\) 代表有 \(i\) 个位置代表满足 \(p_i=i\)。此时对于一个物品(即状态),设其有 \(m\) 个位置满足 \(p_i=i\),那么其贡献到 \(j\) 上的并非 \(0/1\),我们将其定义成 \(\binom{m}{i}\),根据上文组合数学的经典式子 \(f(x)=\sum\limits_{i=0}^x\binom{x}{i}(-1)^{i}=0^x\),取 \(f_i=(-1)^i\) 即可。
注意到这个式子对于某个条件 \(C_i\) 也是很好单独求的。
错排问题加强:设一个 \(n\) 阶排列有 \(m\) 个位置满足 \(p_i\neq i\),那么该排列的价值为 \(a_m\),求所有排列的价值之和。
使用和上面相同的定义。
直接 \(O(n^2)\) 求出 \(f_i\) 即可。时间复杂度 \(O(n^2)\)。
反演
考虑 \(n\) 维向量 \(F\)、\(H\),设有线性变换 \(H=G\times F\),同时 \(G\) 可逆,那么有 \(F=G^{-1}\times H\),此时 \(G\) 就是变换,\(G^{-1}\) 就是反演。
二项式反演
定义在实数到实数的函数 \(f\) 和 \(g\) 上,考虑有:
那么存在:

浙公网安备 33010602011771号