容斥原理
- 全集减去补集的并就是集合的交
问题模型
- 具有属性/限制条件
- 我们可以对于每个属性建立一个集合,补集就是不满足这个属性的集合
不定方程非负整数解计数
给出不定方程
和 个限制条件 ,求非负整数解
- 属性有
个,分别是 - 考虑容斥,全集是
,现在目标是求出补集的并集,这个东西可以容斥 - 考虑
这个东西怎么求,也就是一些补集的并的大小 - 交集表示
的解的数,而交集表示同时满足这个条件,因此在这个不定方程中有些有下限制,有的没有 - 因为都是非负整数,所以我们直接将下标减去,那么每个变量的下界就都是 0 ,因此对于这个交集的不定方程形式就是
- 这个显然是可以用组合数来表示的
- 这个长度为
的 数组其实就是在枚举子集
HAOI2008 硬币购物
- 4 种面值,第
种面值是 。每次询问给出每个硬币的数量 和一个价格 ,问付款方案数 - 每次背包不太行
- 实际上就是在求
的非负整数解的个数 - 那么每次都像上面一样容斥一下,因为数量很少,所以枚举子集是足够的
错位排列的计数
- 属性就是
- 全集就是阶乘,套用上面的公式,其实就是要求补集的交集的大小
- 此处的补集是
的方案集合。 - 那么补集的交集(假设有
个)的大小就是 - 那么整个式子就出来了,最终的式子是
完全图子图染色问题
一个
个节点完全图,对于一个边集 , 为用 个颜色去染的方案数 染色的规则是相邻的颜色必须同色
如果
是奇数,那么 A 得分,否则 B 得分 问 A 和 B 的差值
- 考虑将每一条边两边的端点的颜色相同作为一种属性,假设集合为
- 对于每条边我们映射成一个数字,假设是一组边集是集合
,假设边集为 - 那么
- 对于
- 那么
- 这个东西不就是
- 那不就是只要有一对端点颜色相同就可以了
- 那么正常的容斥就可以了
容斥原理求最大公约数为
设
, 表示最大公约数为 的有序对数,求 到
- 而公约数为
的倍数的个数就等于最大公约数为 的倍数的有序对数的和 - 所以
- 当
,可以直接算,因为后面不可能出现 的 2 倍在 以内 - 所以我们可以倒推
容斥原理推导欧拉函数
,先将 因式分解- 我们设属性为
为一种属性,假设集合为为 - 那么就是求
- 这个东西的全集就是
,那么其实就是要求补集的交,显然一个补集的交集就是同时是几个质数的倍数的个数,就是 - 所以才有最后的欧拉函数的一个通式
容斥原理一般化
那么
同理
那么
- 我更愿叫它 "容斥反演"
DAG 计数
对
个点带标号的有向无环图进行计数,对 取模,
- 因为每个 DAG 的入度/出度为 0 的节点是固定的,也就是特殊点
- 我们考虑枚举一个,这里枚举入度
- 思考入度为 0 的点个数大于等于
的方案数为先选择 个,这些点和剩下的点随便连边 - 但是我们发现这样会发生重复,并不是严格意义上的大于等于
的方案数 - 但是事实上
, 为恰好的方案数 - 那么反演过来就是
- 最后的
- 我们将每个
展开,然后发现最后 的系数为 - 通过组合公式
,可以具体求出每个的系数
二项式反演相关
- 我们可以用上一题的思路来做
- 既然是求恰好,那么我们就构造
- 而这个题也很好构造这个东西,取所有长度为
的子集,算出来的字符串的和就是 了 - 然后反演一下就可以了,总的复杂度为
全序关系
对于任意
都成立
- 反对称性:若
那么 - 传递性:若
,那么 - 完全性:
或
Min-Max 容斥
- 对于满足全序关系并且其中元素满足可加减性的序列
,设其长度为 ,并设 ,则有
- 对于期望仍然是有效的,因为满足全序且可加减
- 注意到这里指的是期望的最大最小值,不是括号里的
- 更强的
- 这个同样可以套上期望
- 根据
容斥还可以知道
- 这里的
分别代表最大值,最小值,加,减 - 具体的可以想象成对于每个质因数选出一个最大值,最后相乘
- 而最大值容斥的时候最小幂次就可以表现成所有数的
一般的,我们一般会先将题目转换成求
对于一个集合第一个出现的期望步数,就是概率和再导过来,因为系数符合几何概率分布
- 期望走几步走完集合 S ,其实就是求集合 S 中走到的步数期望值最大的,那么用 Min-Max 转换成求最小
- 那么就可以反过来求集合 T 到 x 走到的期望
- 直接求是
,因为是在图上,要高斯消元 - 但是这里很特殊是棵树,所以我们完全可以以特殊的解法来解决
- 我们以
为根,树上的每个节点的期望一定可以用形如 的形式表达,也就是用父亲来表达 - 那么最后求到根,它的期望就是
,因为没有父亲 - 可以预处理好每个集合对应的值,那么
- 那么现在的复杂度就是
- 事实上我们发现这个式子其实就是一个子集前缀,那么用 FWT 或运算正变换一下,得到的
数组就是所有子集的答案 - 那么复杂度就可以做到
- 首先可以用 Min-Max 转换成对于一个集合求 Min
- 一个集合的一个元素取到的概率为 p ,那么期望次数就是
- 但是这里的
太大了,肯定没办法枚举子集 - 观察到每个子集的贡献和
和 有关 - 那么设
表示前 个集合大小为 , 的方案数 - 然而你会发现这个是
,需要优化 - 考虑将这个
系数优化掉, ,我们利用这个拆式子,但是这个 就不固定了 - 观察到题目中
,而我们一开始将 ,所以 - 所以这个
是很小的,所以总的复杂度就为 ,空间拿滚动数组做
- 这个东西明显套 Min-Max 容斥,改成求 Min
- 对于一个集合的 Min 那不就是只要能对这个集合的做贡献的数的概率和倒过来
- 你会发现这就是个子集前缀和的形式,用 FWT 正变化一下就可以得到之后的序列了
- 总的复杂度为
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】