注:实在想切 相互再归的鹅妈妈 和 [GDKOI 2024]异或图 的,建议先开 [POI2006] KRY-Crystals 题解看一下。

天下 OIers 苦证明久矣。通过对集合划分容斥的学习,使我加深了对容斥的目的与过程的理解。

先看最原始的集合划分容斥。

相互再归的鹅妈妈

在 0 到 R 间选 N 个互不相同的数 x1~N,使它们异或和为 0,求方案数。(R<=21e6-1,N<=7)

用本文第一行的方法求允许存在相同的数的答案。

考虑原始的容斥。\(\binom N2\) 条要求,形如某两个数不相等。枚举这些要求的子集 \(S\),表明钦定违反这些要求,求方案数乘容斥系数 (-1)|S|,再求和。具体地,把被违反的要求看作边,连成若干连通块,钦定连通块内部选的 x 两两相等,求方案数。注意这里不要求一个连通块选的 x 不与其他连通块选的 x 不相等,我称之为连通块方案

交换求和顺序算贡献。发现对于一个考虑到的连通块方案,其容斥系数和,就是满足 S 中的边连成的连通块方案恰符合此方案,(-1)|S| 之和。

计算这个容斥系数和。对每个连通块分别考虑,最后乘起来就行。设 f(n) 表示 n 个点,边集 S 满足图连通,\(\sum(-1)^{|S|}\)。设 g(n) 表示 n 个点,任何一个边集 S,\(\sum(-1)^{|S|}\)。注意到 g(n)=[n=1]。这里用个小容斥,枚举 1 所在连通块大小 i,可得 \(f(n)=g(n)-\sum_{i=1}^{n-1}\binom{n-1}{i-1}\cdot f(i)\cdot g(n-i)=[n=1]-f(n-1)(n-1)\),边界 f(1)=1,归纳可得 f(n)=(-1)n-1(n-1)!。

这样,就可以枚举连通块方案(即集合划分方案,总数为 Bell 数),设奇数大小连通块个数为 m,求任选 m 个数异或和为 0 的方案数,乘上容斥系数,求和,就是答案。


以上是个硬核方法。以下来个有目的性的方法。

对于一个真实的连通块方案(即严格满足 x 相同的在同一连通块,不同的在不同的连通块),记 ai 表示第 i 个连通块大小,计入的次数为 [x 互不相同]=\(\prod [a_i=1]\)

一个真实的连通块方案被上述的集合划分容斥(即枚举连通块方案)考虑到,当且仅当任意两个实际就不在同一个连通块的,在枚举的方案中也不在同一个连通块。枚举连通块方案时,给每个连通块分配与大小相关的容斥系数 f(siz),那么方案的容斥系数就是各连通块的容斥系数之积。

对于一个真实的连通块方案中的每一个连通块,可以聚焦所有与之相关的 f(siz) 之积,其他项提取公因式,所要求的就是 \(\sum_\text{划分} \prod_{siz_i\in\text{划分}} f(siz_i)=[a_i=1]\)

严谨推导式子:

\[\begin{aligned} &[a_i=1]\\ =&1^{\underline{a_i}}\\ =&\sum\limits_{i=0}^{a_i}(-1)^{a_i-i}{a_i\brack i}\\ =&\sum\limits_{m\in S}(-1)^{a_i-k}\prod_{i=1}^{k}(siz_i-1)!\\ =&\sum\limits_{m\in S}\prod_{i=1}^{k}(siz_i-1)!(-1)^{siz_i-1} \end{aligned}\]

其中 \(m\in S\) 表示对大小为 ai 的集合 S 划分成 k 个连通块,大小分别为 sizi。

易得 f(siz)=(-1)siz-1(siz-1)!。


另一个例子。

BZOJ4671 异或图

一个 N 个点的完全图,给定 M 个边的子集,求有多少个子集的“异或”使得图连通。(N<=10,M<=60)

以下用第二种方法。仍然要明确容斥方式,即枚举集合划分,钦定不在同一集合的不连通。注意这里不要求同一集合的必须连通,我称之为连通块方案

对于一个真实的连通块方案(即严格满足连通的在同一连通块,不连通的在不同的连通块),计入的次数为 [图连通]=[连通块个数=1]。

一个真实的连通块方案被上述的集合划分容斥(即枚举连通块方案)考虑到,当且仅当任意两个实际在同一个连通块的,在枚举的方案中也在同一个连通块。仔细考虑,就是对真实的连通块方案进行集合划分,任意一个划分均能统计到它。

设与连通块个数相关的容斥系数 f(n),则 \([n=1]=\sum_{i=1}^n{n\brace i}f(i)\),反演得 \(f(n)=\sum_{i=1}^n(-1)^{n-i}{n\brack i}[i=1]=(-1)^{n-1}(n-1)!\)


给定边集的例子。

[GDKOI 2024]异或图

n 个点 m 条边的无向图和一个长度为 n 的数组 ai 以及一个整数 C,你需要求出有多少个长度为 n 的数组 b 满足:

  1. 0<=bi<=ai。
  2. 对于每条边 (u,v),bu!=bv。
  3. b 的异或和为 C。

(n<=15)

先用本文第一行的方法求出 m=0 的答案。

以下用第一种方法。枚举边集的子集 S,表明钦定违反这些要求,求方案数乘容斥系数 (-1)|S| 的和。算贡献,即枚举集合划分,钦定在同一集合的 b 相等。注意这里不要求不同集合的 b 不相等,我称之为连通块方案,发现 S 满足形成的连通块方案与之恰符合,即 S 中的边集不跨越不同的连通块,同一连通块内边集形成的图连通。

这里实际上是对每个连通块内求容斥系数和,外面相乘。设 f(V) 表示点集 V,V 导出子图边集的子集 S 满足图连通,\(\sum(-1)^{|S|}\)。设 g(V) 表示 V 个点,V 导出子图边集的子集 S,\(\sum(-1)^{|S|}\)。注意到 g(V)=[|E|=0]。这里用个小容斥,枚举最小点所在连通块的点集 T,可得 \(f(V)=g(V)-\sum_{mn\in T}\cdot f(T)\cdot g(V\backslash T)\)

这样就能 O(3N) 计算容斥系数了。


你可能要问我什么时候用第一种方法,什么时候用第二种方法。答案是怎么方便怎么来。

网上还有生成函数的表述,这里一并解读。

引用一份看到的形式化描述:在某种等价关系下,对于某一组合结构,构成其的元素其可以被划分成若干等价类,有一关于等价类的系数 F(x)(即这一等价类的贡献系数)。而我们的 dp 不能恰好地刻画出每一极大等价类(有可能有相互等价的等价类),记等价类之间的合并关系为 G(x),我们设计容斥系数 H(x) 满足:G(H(x))=F(x)。

可能看不懂,没有关系,看看就好。

在第一个、第三个问题中,我们枚举真实连通块方案中每一个连通块(即实际极大等价类)的无序集合划分,即 EGF 的 exp,应计入的次数 F 是 [xS]exp(H(x))=[S 合法],其中 H 是容斥系数。第一题中,S 合法当且仅当其大小(即等价类大小)为 1。第三题中 S 合法当且仅当它是独立集。修正常数项即可得到第一题 H(x)=ln(x+1),第三题 H(x)=ln(?(x)+1),其中 \(?(x)=\sum_{S\ne\varnothing}[S \text{是独立集}]x^S\)

posted on 2024-10-14 21:30  Zaunese  阅读(51)  评论(0编辑  收藏  举报