省选计划1.21

主题:容斥反演。

容斥

\(n\) 个集合的并集。

\[|\cup p_i|=\sum\limits_{S\in \{1,2,\dots,n\}} (-1)^{|S|-1}|\cap p_{S_i}| \]

\(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|\)。如果可以,那么求交集时会有另一个式子:

\[|\cap p_i|=\sum\limits_{S\in\{1,2,\dots,n\}}(-1)^{|S|}|\cap\overline{p_{S_i}}| \]

\(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\),那么直接插板即可,给出答案:

\[\sum\limits_{i=0}^n(-1)^i\binom{n}{i}\binom{S-i(K+1)+n-1}{n-1} \]

给一张无标号图 \(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\) 的子集的方案数,那么显然存在的关系是:

\[g(S)=\sum\limits_{T\in S}f(T) \]

而我们刚才得到了这样的一个式子:

\[f(S)=\sum\limits_{T\in S}(-1)^{|S|-|T|}g(T) \]

我们断言,任意对于某个集合的函数 \(f,g\),若第一条关系成立,则第二条关系也成立。给出粗略证明:

\[f(S)=\sum\limits_{T\in S}(-1)^{|S|-|T|}\sum\limits_{Q\in T}f(Q) \]

\[f(S)=\sum\limits_{Q\in S}f(Q)(\sum\limits_{T\in S/Q}(-1)^{|S/Q|-|T|}) \]

对于关于集合 \(P\) 的函数 \(F(P)=\sum\limits_{T\in P}(-1)^{|T|-|P|}\),存在 \(F(P)=0^{|P|}\)

证明

\[F(P)=\sum\limits_{i=0}^{|P|}\binom{|P|}{i}(-1)^{|P|-i}1^i=(1-1)^{|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\) 条件下的贡献,那么要有:

\[\sum\limits_{i=1}^nval(C_i)f_i=val(C_0) \]

如果能构造出 \(C_i\)\(f_i\),同时能求出在每个 \(C_i\) 下的所有物品贡献之和 \(sum_i\),那么就有:

\[\sum\limits_{i=1}^nsum_i\times f_i=sum_0 \]

在前文的容斥中,我们都是将 \(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\),求所有排列的价值之和。

使用和上面相同的定义。

\[\sum\limits_{i=0}^m\binom{m}{i}f_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\) 上,考虑有:

\[f(n)=\sum\limits_{i=0}^n\binom{n}{i}g(i) \]

那么存在:

\[g(n)=\sum\limits_{i=0}^n\binom{n}{i}(-1)^{n-i}f(i) \]

posted @ 2025-01-22 14:43  BYR_KKK  阅读(36)  评论(0)    收藏  举报