详细揭秘:集合划分容斥的容斥系数
dp 转移时,我们有时会要求枚举一个极大的合法子集进行转移,但是往往不能很好地处理极大的限制,只能枚举一个不作限制的合法子集。我们希望通过容斥使得每个极大的子集的转移正确。
引用一份看到的形式化描述:在某种等价关系下,对于某一组合结构,构成其的元素其可以被划分成若干等价类,有一关于等价类的系数 (即这一等价类的贡献系数)。而我们的 dp 不能恰好地刻画出每一极大等价类(有可能有相互等价的等价类),记等价类之间的合并关系为 ,我们设计容斥系数 满足:
例:DAG 定向问题
给你一个 个点 条边的无向图,给每条边定向并要求不出现环,求定向方案数。
。
我们知道,这个经典问题的 dp 方法为每一次枚举当前入度为 的极大子集 将其删去。设 表示 内的点能否入度为 ,即 是否是独立集, 表示 内点的定向方案,有:
我们尝试用上述方法得到这个 的容斥系数: 表示的是极大的入度为 的点集为 时需要贡献的系数,显然 。合并方式为每次加入一个非空无交子集,可以得出 。所以 ,手动求逆得到 。
设 ,所求即为 。
例:计树
求有多少不同的包含 个点的有标号无根树,满足:对于任何一个点 ,都存在点 使得 和 之间有一条边且 。
。
树的形态必定为若干值域连续的链拼起来。
根据 Prufer 定理, 个大小分别为 的连通块形成树的方案数为:
那么我们每加入一条极长的长为 的链将答案乘以 ,最后除以 。因为我们不能钦定极长,所以需要容斥。
题目要求链长 ,那么 ;合并方式与 DAG 定向问题类似,每次直接拼一段上去,;简单计算得到 。
设 ,所求即为 。
例:Yet Another ABC String
给出 ,求由 个 A, 个 B, 个 C 构成的字符串数量,使得不存在子串
ABC
,BCA
和CAB
。。
将序列划分为若干极长的形如 ..BCABC...AB...
的连续段。则每个连续段必须 即 ,。
手玩求逆可以得到:
设 为一个连续段的生成函数:
答案为:
例:Yet Another Permutation Problem
有一个长为 的排列 ,初始 ,接下来你需要对它进行若干次操作,每次操作你可以指定一个 ,将 取出后放在排列的开头或末尾。对 求出经过 次操作能得到几种不同的排列。
。
判断一个排列是否可行,考虑将操作反过来:将排列的开头或末尾任意插入排列中。不难发现排列合法当且仅当存在一个长度 的上升子区间,将该区间外的数依次向内插入即可。
令 ,不妨计数所有极长上升子区间长度都 的排列数量。,。
令 为一个上升子区间的 EGF,即 ,所求即为 。注意到 只有 项,所以直接暴力求逆也可做到 。
例:Distinct Multiples
给定 以及一个长为 的序列 ,你需要计数有多少个值域为 的序列 满足 且 两两不同。
。
考虑令等价类为相等的数的集合,则所有极大等价类大小必须都为 ,即 。注意此处等价类之间的合并是无序的,则 ,,模拟得 。
令 表示等价类 的方案数,,所求即为 。
例:A Nameless Counting Problem
给定 ,求有多少个长为 的单调不降序列 ,满足 且 。
。
考虑不断将序列中相同的数配对删除,最终得到一个单增的序列。一个长为 的不重序列对应回原序列的方案数为 。
容斥掉互不相同的限制,容斥系数同上题。但此时答案不能简单地由状态的等价类信息得出。设 表示长为 的序列,由高至低考虑到第 位,有 个数顶着上界 时满足 这些位的限制的方案数,转移可以枚举这一位有几个数仍顶着上界。
考虑分别有 个奇偶大小的等价类,则贡献为 ,则设 为目前已经有 个数,有 个奇数大小等价类的贡献和。等价类之间无序,转移时枚举包含 的等价类大小即可。
时间复杂度 ,使用生成函数刻画可以得到更优的做法。
例:异或图
给定一个 个点 条边的图以及一个长为 的序列 ,有一常数 ,你需要求出有多少序列 满足 ,,。
。
考虑 怎么做,从高至低枚举第一个不全顶到上界的位 ,则低 位只需要一个在第 位不顶到上界的数进行调整,其余数任选即可。
令等价类为相等的数的集合,则 等于 当且仅当 内点在图上为独立集。 可以直接求出。
考虑一个状态的答案,我们只关注每个等价类内部的最小值。每个大小为偶数的等价类均可随便取,大小为奇数的等价类的最小值(称为关键点)构成 的子问题。
设 表示当前已经考虑了 内的点,其中关键点的集合为 的方案数,时间复杂度为 。
此时记录了大量无用信息,我们将 从小到大排序,逐个尝试加入关键点。设当前加入到 ,则 的点已经必然在考虑的点集中,只需要记录它们是否在关键点集中; 的点必然不在当前关键点集中,只需要记录它们是否在已考虑点集中。这样状态数就减小至 ,再加上枚举子集,时间复杂度为 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)