9. 容斥与反演
9.容斥与反演
容斥原理:
感性理解:
证明:考虑一个元素
不定方程计数
有不定方程
,均为非负整数,有限制 ,求解数。 。
- 不好直接做,考虑容斥。
- 枚举几个至少大于
, 则变成 ,问题转化为没有限制的问题,运用插板法解决。
多重集的错位排列
给定非排列的
,求有多少种改变顺序得到的 ,满足 。 。
普通错排的递推式就是
但是错排还有容斥形式,至少一个的容斥系数就是:(固定零个)-(固定一个)+ (固定两个)-(固定三个)+(固定四个)...
即:(刚好打破
写成封闭形式,即
回顾一下容斥原理的本质:容斥系数为正的时候,是为了求出那些最后一次有机会能求出的数。
另外,对于多重集的全排列公式,即
考虑
枚举当前数字
最后答案即
[JSOI2015] 染色问题
给你一个
的网格和 种颜色,要求每行,每列至少染色一个, 种颜色必须全用。 。
发现有三层限制,我们至少要容斥掉两层。
设
再容斥一维,看哪些列全为
[ZJOI2016] 小星星
给你一个无向图,再给你一个
个点的树,问有多少给点重编号的方式,使得树上的边均存在于原图中。
。
不容易想到
转移方程:
考虑我们为什么要存一个子集,是为了保证重标号的结果是一个排列,也即不重不漏,怎么计数?容斥!
枚举一个
[TJOI2019] 唱、跳、rap和篮球
给定
个唱跳rap篮球,将他们放在长度为 的序列中,求有多少方案满足不存在相邻的唱跳rap篮球。相同类型彼此不区分。 。时间限制 。
很套路的容斥,我们钦定有
因为
一个比较关键的是:钦定
因此答案即为
[AHOI2018初中组] 球球的排列
给定序列,求有多少种排列方式,使得没有相邻两个数的乘积是完全平方数。
。
首先易得关键性质:若
于是题意可以转换为:
有
种颜色的球,第 种的颜色有 个, ,求同色不相邻的方案,球有编号。
真的是组合计数困难题呀,想了一天的式子,中间牵扯到多重集全排列以及交换求和顺序等等知识点。
O(n^3) dp做法:
- 设
O(n^2) 容斥做法:
-
我们可以 钦定 对于前
种颜色,总共有 个相邻,当前颜色有 个相邻,这样的情况有多少? -
设
表示总共有 个相邻。
容斥在什么时候起效?
或 或- 至少 或 恰好
二项式反演
实际上,反演在线性代数上的本质相当于矩阵乘法,即为,有两个向量
,转移矩阵 ,有 如果
存在逆 ,则有: 问题转化为了构造矩阵以及求矩阵逆元。
由此本质出发,矩阵自身进行一些转置什么的操作,依旧满足性质。
定理内容:
若
则有:
证明:使用vfk原ppt方法
我们依旧回到错排问题,设
即为枚举哪些人站错了,剩下的人都站对了。
考虑一个显然正确的式子:
对于艾佛森括号,我们可以通过二项式定理展开,即:
再次代入:
其中有两个组合数,考虑组合意义:先在
交换求和符号:
不难发现后面的式子即为
令
证毕。
“至多/至少"和"恰好"的转换
考虑组合意义,上式的
应用在于算容斥系数。
例题1:P4859 已经没有什么好害怕的了
给定两个序列,
,要求两两配对使得 的配对数减去 的配对数恰好等于 ,求方案数。 。保证 互不相同。
因为没有相等的元素,所以
问题变成了计数
我们肯定需要分别升序排序,然后考虑
设
如果当前
但是如果匹配了一个大于
考虑反演。我们要计算 恰好有 k 对匹配,通过二项式反演,我们也可以求 至少有 k 对匹配。
设
设
然后对于恰好的转换就是:
降智错误:最后的 k,实际上是 (n+k)/2!!!
子集反演
定理内容
若
则有:
证明
类似的,我们可以反演艾佛森括号:
等价于二项式反演,因为元素大小为
P6442 [COCI2011-2012#6] KOŠARE
给定
个箱子,每个箱子中有若干件物品,所有物品的种类数 ,求选择箱子的方案数,使得每种物品都被包含。 。
直接做不好做,显然用子集反演,但是是选择“至少”还是“至多”呢?
我们考虑
再求出
可以发现
[ARC101E] Ribbons on Tree
给定大小为
的树,给树上的点两两配对,对于每一组配对 将其路径上的边全部覆盖,定义一个配对方案合法,当且仅当每一条边都被覆盖。 且是偶数。
套路的,有
设
这样没有优化的空间了,考虑子集反演(容斥):
P3813 [FJOI2017] 矩阵填数
给定一个
的矩阵,每个位置可以填 的数。 有
个限制:表示一个子矩阵的最大值为 。 求方案数。
。
对于多个矩形,满足条件是不好做的,但是不满足条件是好做的,只需要
设
因为
这样暴力遍历矩形并 checkmin
,可以在
时间复杂度
当走不动的时候多想想离散化,NOIP2023T4说不定就拿满了。
这里二维矩形的离散化来整理一下,两种思路:
-
每个点保存以其为右上角的矩形,放在一维上存的是
左开右闭,注意到这样可以充分利用 ,但仍要加入 。对于输入矩形
,因为左开右闭,所以实际上存的是 ,进行遍历的时候,实际上是:for(int x=q[j].x1+1;x<=q[j].x2;x++) { for(int y=q[j].y1+1;y<=q[j].y2;y++) { a[x][y]=min(a[x][y],q[j].v-1); } } for(int x=1;x<=tot1;x++) { for(int y=1;y<=tot2;y++) { int s=(X[x]-X[x-1])*(Y[y]-Y[y-1]); ans=ans*ksm(a[x][y]%mod,s)%mod; } }
-
每个点保存以其为左下角的矩形,放在一维上是左闭右开,这样需要加入
。对于输入矩形,其右上角要加一,遍历的时候只能到右端点减一。
都可以先从一维上考虑,理清思路再写,检查考场上会写慌。
[SHOI2016] 黑暗前的幻想乡
有一张无向完全图,每条边有一个颜色,总共有
种颜色,求恰好有 种颜色的生成树个数。 。
这题也非常牛!
如果已知一个无向图,那么我们很好用矩阵数定理求生成树个数。
但是颜色的限定很制,限制表示一个颜色只能选一条边,我们枚举选的颜色集合,表示至多打破这些颜色的限制,形成的生成树个数,最终要求的是恰好打破 0 个颜色限制的个数。子集反演即可。
Min-max 容斥
定理内容
证明
对于每一个
由二项式反演易知其结果为
期望形式
扩展形式
P3175 [HAOI2015] 按位或
初始手上有一个
,每一秒你可以选择一个 的数字与手上的数字进行按位或,选择 的概率是 ,问期望多少秒后手上的数字变成 。 。
前置知识:离散随机变量的几何分布
这是高中数学吗?
抛出一个六面的筛子,丢出数字
的期望是多少?答案即为 。 证明:
我们把
注意我们求概率
因此,我们只需计算一遍高维前缀和即可,如果最后要求任意结束位置,则需要求两遍高维前缀和。
P4707 重返现世
[PKUWC2018]随机游走
有根树,初始给定起点。每次询问树上随机游走经过一个点集中所有点至少一次的期望步数。
。
相当于求集合最后一个点经过的时间,可以用Min-Max容斥转换为求第一个点经过的时间。
根据期望的套路,可以直接dp,设
需要高斯消元,时间复杂度
对于树上需要高斯消元的问题,如果我们将转移方程写成关于父亲的函数,那么可以在 O(n) 时间做树上高消。
具体的,设
非常牛,同时和 ,可以直接一遍树形 dp 得到。
错误的,不要忘了 return
即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?