容容容容斥斥斥容容斥(完善中)
Part 0 容斥原理
§ 0.0 容斥原理及其本质
表达式各个部分的含义
最常见到的容斥原理的形式如下:
如何理解?
假如说我们面对一个特殊的问题,计算某些集合的交集十分容易,也就是说,我们可以在极低的开销下,指定若干个属性,并统计拥有这些属性的元素的个数。
注意,不是“恰好拥有”,而就是简单的“拥有”。
现在我们定义一种操作,指定一个
注意!这里查询的不是并集,有一些元素会被计算多次!一些博客文章会把这种操作称为“查询至少有
个属性的元素数目”,这种称呼其实不是很严谨。
为了下面的叙述方便,我们把这一操作称为 “钦定拥有
那在这种条件下,如何统计一共有几个元素至少有一种属性呢?
我们统计钦定拥有
接下来,只要我们参与运算的量都是形如【钦定拥有
那么我们减去钦定拥有
所以为了填补这部分的空缺,继续重复以上过程直到结束(计算完【钦定拥有
根据刚刚的过程,回顾一下式子的含义:
这里把
标为橙色的部分代表的就是“钦定有
标为蓝色的叫做容斥系数,代表了刚刚过程中加上还是去掉的动作,一般来说容斥系数的指数就是“钦定”的属性的数目减去一。
变型
一般来说,容斥原理适用于以下的两种情况:
- 计数满足多个条件其一的对象数目。把满足一个条件的对象组成一个集合,然后直接套用容斥即可。
- 计数满足所有条件的对象数目。这个时候把限制取反,那么计数的对象转变为求所有满足至少一条限制的对象数目,这个可以用容斥做,再用全集的大小减去这个答案。
经验:做容斥题的时候,想办法让“限制的数目”变成一个常量,方法包括但不限于加入大小为零的对象、不可能满足的条件等。
而对于后面的一种情况,式子可以写作:
所以,这种情况下需要做的是:把容斥系数的指数加一;限制取反;最终加上全集的大小。
容斥恒等式
事实上,容斥原理的表达式还蕴含了一个信息:每个元素对于右侧式子的贡献为
换句话说,如果每个元素的权值不一样的情况下,对于任意的函数
而言,也有如下形式的容斥原理:
呃这么写似乎有点反人类
用另一种方法来写的话,我们考虑到表达式右侧的部分,相当于在
很自然的,我们想把
但是这里我们默认了
这个恒等式就是容斥原理的本质了,它对于任意的集合
证明的话,用二项式系数就可以了。
§ 0.1 子集反演
所以,不知道是出于什么原因,你有了一个关于集合的函数
现在你已知任意
这是一个标准的反演问题,笔者会在不久后写一篇专门的博文。但是这里先用容斥原理解决。
考虑用容斥解决,我们定义一堆新的集合
而这是限制的交集,每一个限制形如 “
用容斥解决的话先找出全集的贡献:【对于所有
所以我们轻松地得到了式子:
表示全集的贡献,而不是全集本身。
其中
观察到
加上条件:
这个就叫子集反演。
然后我们令
做一些小调整:
然后再定义两个新函数:
带入刚刚的式子:
这就是子集反演的补集形式。能不能叫超集反演
§ 0.2 二项式反演
把刚刚子集反演的
§ 0.3 Min-Max容斥
基本形式
现在你有一些数字,你需要求出它们的最大值,但是你不能比较两个元素的大小,只能查询任意一个集合里面的最小值。
这该怎么做呢?
我们把一个数字
诶,这个就可以容斥了。
当然,我们把
化简:
根据容斥恒等式,有:
这个和上面那个式子就叫做 Min-Max 容斥。
虽然没人会用这种方式求最大值,但是这个东西是可以推广到期望中的!
在期望方面的应用
假如我们想要计算一个序列最大值的期望:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具