主题:容斥反演。
容斥
求 个集合的并集。
不可为空。
简单证明:
考虑一个元素出现在 ,考虑其的贡献。为 。根据二项式定理对其进行变形,。
有时候需要求集合的交集,令 为 的补集,则 ,,令 为全集,则 。
注意到在容斥式子中我们给出了 不可为空的限制,因为在大多数题目中,当 为空时可以直接求出 。如果可以,那么求交集时会有另一个式子:
可以为空。
不定方程计数。对 ,,对解计数,。
将 作为属性,求集合的并集,然后利用总方案数减去并集大小即可。注意所有方案均需满足 。如果钦定了 个位置满足 ,那么直接插板即可,给出答案:
给一张无标号图 和一张有标号树 ,求有多少种给 标号的方式使得 是 的一棵生成树,。
如果一开始就往容斥上想并不好做,考虑一个暴力的做法。
首先给图标号这种事情看上去无从下手,考虑先给图随便标一个号,然后统计有多少种映射合法。令 代表 上的 映射到了 , 的子树内的映射到的集合是 的方案数。转移做子树合并。时间复杂度 。
考虑复杂度的瓶颈在于状态中的集合 ,其作用是为了避免重复,尝试用容斥去掉 这个限制。
令 代表 中的所有点不必映射成 阶排列,而是只需映射到 这个集合中即可。那么答案就是 ,我们将映射后每个点是否被映射到视作属性,那么我们就是要求所有点都被映射到, 实际上同样等价于 没被映射到的方案数,做容斥即可,这也解释了容斥系数中的 从何而来。
考虑如何求 ,我们枚举 ,在做 dp 的过程中要求必须填 中的数即可。时间复杂度 。代码。
从暴力 dp 到正解中最关键的一步思考就是将映射成 阶排列这个条件变成所有 个点都被映射到。
不妨考虑能否将 和答案的关系一般化。令 代表映射到的集合恰好为 的方案数, 代表映射到的集合为 的子集的方案数,那么显然存在的关系是:
而我们刚才得到了这样的一个式子:
我们断言,任意对于某个集合的函数 ,若第一条关系成立,则第二条关系也成立。给出粗略证明:
对于关于集合 的函数 ,存在 。
证明
所以 。
实际上,这是子集反演的一种形式。当我们将 看作至多, 看作恰好时,这个式子会起很大的作用。
思考
容斥可以对于一些限制,将恰好转变成至少来放宽一些条件,以及后面反演中将涉及的 和 的转化。
凑容斥系数
刚才所有的容斥都是利用集合来理解的,考虑如下的理解方式:
要对所有物品在 条件下的贡献求和,那么考虑构造一些其它条件 ,并且有容斥系数 ,设 是某个物品在 条件下的贡献,那么要有:
如果能构造出 和 ,同时能求出在每个 下的所有物品贡献之和 ,那么就有:
在前文的容斥中,我们都是将 视作对所有集合求交,同时容斥系数 ,或者在此基础上做了一些本质区别不大的改变。
错排问题:求 的 阶排列数。
在广义的容斥中,往往很多时候都将一个状态视作物品。在这里,我们将一个 阶排列视作一个物品。
直接的想法是让 代表 , 代表某一个子集满足 ,这样的话并不能刻画出容斥系数,此时条件之间的运算本质上还是逻辑与。
令 代表有 个位置代表满足 。此时对于一个物品(即状态),设其有 个位置满足 ,那么其贡献到 上的并非 ,我们将其定义成 ,根据上文组合数学的经典式子 ,取 即可。
注意到这个式子对于某个条件 也是很好单独求的。
错排问题加强:设一个 阶排列有 个位置满足 ,那么该排列的价值为 ,求所有排列的价值之和。
使用和上面相同的定义。
直接 求出 即可。时间复杂度 。
反演
考虑 维向量 、,设有线性变换 ,同时 可逆,那么有 ,此时 就是变换, 就是反演。
二项式反演
定义在实数到实数的函数 和 上,考虑有:
那么存在:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?