注:实在想切 相互再归的鹅妈妈 和 [GDKOI 2024]异或图 的,建议先开 [POI2006] KRY-Crystals 题解看一下。
天下 OIers 苦证明久矣。通过对集合划分容斥的学习,使我加深了对容斥的目的与过程的理解。
先看最原始的集合划分容斥。
相互再归的鹅妈妈
在 0 到 R 间选 N 个互不相同的数 x1~N,使它们异或和为 0,求方案数。(R<=21e6-1,N<=7)
用本文第一行的方法求允许存在相同的数的答案。
考虑原始的容斥。有 条要求,形如某两个数不相等。枚举这些要求的子集 ,表明钦定违反这些要求,求方案数乘容斥系数 (-1)|S|,再求和。具体地,把被违反的要求看作边,连成若干连通块,钦定连通块内部选的 x 两两相等,求方案数。注意这里不要求一个连通块选的 x 不与其他连通块选的 x 不相等,我称之为连通块方案。
交换求和顺序算贡献。发现对于一个考虑到的连通块方案,其容斥系数和,就是满足 S 中的边连成的连通块方案恰符合此方案,(-1)|S| 之和。
计算这个容斥系数和。对每个连通块分别考虑,最后乘起来就行。设 f(n) 表示 n 个点,边集 S 满足图连通,。设 g(n) 表示 n 个点,任何一个边集 S,。注意到 g(n)=[n=1]。这里用个小容斥,枚举 1 所在连通块大小 i,可得 ,边界 f(1)=1,归纳可得 f(n)=(-1)n-1(n-1)!。
这样,就可以枚举连通块方案(即集合划分方案,总数为 Bell 数),设奇数大小连通块个数为 m,求任选 m 个数异或和为 0 的方案数,乘上容斥系数,求和,就是答案。
以上是个硬核方法。以下来个有目的性的方法。
对于一个真实的连通块方案(即严格满足 x 相同的在同一连通块,不同的在不同的连通块),记 ai 表示第 i 个连通块大小,计入的次数为 [x 互不相同]=。
一个真实的连通块方案被上述的集合划分容斥(即枚举连通块方案)考虑到,当且仅当任意两个实际就不在同一个连通块的,在枚举的方案中也不在同一个连通块。枚举连通块方案时,给每个连通块分配与大小相关的容斥系数 f(siz),那么方案的容斥系数就是各连通块的容斥系数之积。
对于一个真实的连通块方案中的每一个连通块,可以聚焦所有与之相关的 f(siz) 之积,其他项提取公因式,所要求的就是 。
严谨推导式子:
其中 表示对大小为 ai 的集合 S 划分成 k 个连通块,大小分别为 sizi。
易得 f(siz)=(-1)siz-1(siz-1)!。
另一个例子。
BZOJ4671 异或图
一个 N 个点的完全图,给定 M 个边的子集,求有多少个子集的“异或”使得图连通。(N<=10,M<=60)
以下用第二种方法。仍然要明确容斥方式,即枚举集合划分,钦定不在同一集合的不连通。注意这里不要求同一集合的必须连通,我称之为连通块方案。
对于一个真实的连通块方案(即严格满足连通的在同一连通块,不连通的在不同的连通块),计入的次数为 [图连通]=[连通块个数=1]。
一个真实的连通块方案被上述的集合划分容斥(即枚举连通块方案)考虑到,当且仅当任意两个实际在同一个连通块的,在枚举的方案中也在同一个连通块。仔细考虑,就是对真实的连通块方案进行集合划分,任意一个划分均能统计到它。
设与连通块个数相关的容斥系数 f(n),则 ,反演得 。
给定边集的例子。
[GDKOI 2024]异或图
n 个点 m 条边的无向图和一个长度为 n 的数组 ai 以及一个整数 C,你需要求出有多少个长度为 n 的数组 b 满足:
- 0<=bi<=ai。
- 对于每条边 (u,v),bu!=bv。
- b 的异或和为 C。
(n<=15)
先用本文第一行的方法求出 m=0 的答案。
以下用第一种方法。枚举边集的子集 S,表明钦定违反这些要求,求方案数乘容斥系数 (-1)|S| 的和。算贡献,即枚举集合划分,钦定在同一集合的 b 相等。注意这里不要求不同集合的 b 不相等,我称之为连通块方案,发现 S 满足形成的连通块方案与之恰符合,即 S 中的边集不跨越不同的连通块,同一连通块内边集形成的图连通。
这里实际上是对每个连通块内求容斥系数和,外面相乘。设 f(V) 表示点集 V,V 导出子图边集的子集 S 满足图连通,。设 g(V) 表示 V 个点,V 导出子图边集的子集 S,。注意到 g(V)=[|E|=0]。这里用个小容斥,枚举最小点所在连通块的点集 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),其中 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?