容斥技术(长期更新)
容斥的最直接的想法就是给算重了的东西填上系数,使得不合法的东西都算了
要证明一种容斥是对的,就考察任意一个对象,验证其计数次数是否符合要求即可。
普通容斥
对于一个集合
证:
设元素
在 个 的子集中被包含,则它对左式的贡献为 。现在来看它对右式的贡献,为:
相当于在枚举 的大小。 所以原式得证。
最为简单的容斥就是正难则反的思想,用不考虑任何限制的减去有限制的,有的时候有限制的可以直接算了就不用继续想了。
二项式反演似乎是很常用的容斥技巧,但是已经把它放在反演里面了,就不单独说了。毕竟二项式反演已经告诉了我们应该使用哪种系数,所以是简单的。
各种反演也是常用的容斥手段,相当于已经知道系数的容斥。
介绍一种将容斥与生成函数相结合的思想,这使得容斥的含金量还在上升。
以下内容纯属口胡,可能不太正确,不太完整。
首先我们可以对要计数的对象搞一个生成函数
于是最终就是
这样做应该就不用猜测容斥系数了(?)。
更一般的凑容斥系数的方法
考虑要计数恰好被
那么就有
令
反演一下得到
Min-Max 容斥
式子:
以上两个式子把
等着补证明。
反射容斥
用于格路计数问题,可以在转移与格路计数类似的DP中见到,然后直接用数学方法优化。
首先容易得到
以及
先来考虑一下Catalan数的格路计数的推导方式解决一个类似的问题,这里我们不能经过
我们对每一种经过了
于是不能经过一条直线的格路计数问题已经解决了。现在来考虑不能经过两条直线的情况。解决了两条直线的情况,我们就已经知道了格路计数中不能经过
两条直线在同侧的情况已经解决了,这里考虑两条直线
我们记
我们记
那么有结论:从
证明是这样的,考虑一个串
然后又怎么算呢?发现
先把
大力观察可以发现,我们不要原来的那个求和号,直接拆开,然后每四个为一组来看,第一个与第三个配对,第二个与第四个配对,可以得到更容易计算的柿子:
注意到随着
其实最终的难点不在于使用反射容斥,而是中间的转化。
例题
P3266 [JLOI2015] 骗我呢
简要题意:
Sol:
首先来想朴素DP。发现一行中数字两两互不相同,一行有
然后手推一下,发现上一行要是没有填
再化一步,注意到有点像前缀和的形式,可以化出
然后这是二维的DP,发现形式很像在格路上统计路径数量。于是把图手画一下。注意
发现反射容斥可以把看起来像格路计数的DP柿子直接
参考:大佬的容斥博客
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效