容斥与反演技巧(一)
其实 2022.9.27 就发布了
二项式反演
我们直接上式子好了
一般有两种形式,第一种是
第二种是
第二种比第一种更加常用。
一般来说我们的 是钦定 个元素必须选中,剩下的随便选的方案数。注意 并非单纯的后缀和。
例题
球的染色
有 个球排成一列,每个球可以染成 种颜色,相邻球的颜色不能相同,但是每种颜色至少出现一次,问方案数。
如果没有至少出现一次的限制那么答案就是 。
考虑转化为 恰好有 个颜色没有出现过,那么设 为钦定某 种颜色没有出现的方案数,那么 。
设 为恰好 个颜色没有出现过的方案数,那么
那么 就是答案啦
SDOI2016 排列计数
考虑设 为钦定 个位置必须放对,剩下的随便放,那么 。
乘上 的原因是我们要先选出来这 个位置。然后 表示恰好放对 个位置的方案数,我们有
然后你用 化简一下发现
前后都可以 预处理,于是这题就做完了。AC Code
BZOJ2839 集合计数
先选出 个元素必须在交集里面,那么剩下的 个元素可以构成 个集合,可以随便选但不能一个都不选,因此方案数为
然后设 为交集大小恰好为 的方案数,那么
注意到只有一次询问,因此可以先算出来 然后直接算出来 。不难在 时间内解决。AC Code
BZOJ3622 已经没有什么好害怕的了
记糖果为 ,药片为 。那么当 不同奇偶时无解,否则应当有 个位置满足 ,剩下的为 。
下面记 为原来的 。 仍然是钦定 个位置,让这 个位置满足 ,想想怎么算方案数。发现不是很好用组合数算。
对于每个 我们算出来 表示 中 的元素个数,将 从小到大排序,那么 序列递增且前面的 是后面的子集。
现在相当于要钦定 个位置选出 所代表的集合中的数且不能重复,剩下的随便选。
这个可以 DP 做, 表示前 个数配了 组时的方案数,那么 。
那么记 ,答案就是 做一个二项式反演。于是这题就做完了,时间复杂度 。AC Code
JSOI2011 分特产
设 为钦定 个人,他们分不到特产,剩下的人随便分,的方案数。那么答案就是 做一个二项式反演。
注意到 实际上等价于给 个人分特产,不过可以有人没分到的方案数。
然后我们发现其实每种特产大概是独立的,那么给 个人分的时候答案就是
我们对每个 把这东西算一遍就得到了 ,再反演就得到了 。暴力算是 的,已经可以通过。AC Code
实际上我们拆拆式子发现
我们发现只要能快速算出来 就能递推。
设 ,那么可以分治 NTT 在 的时间内得到 ,再 做个多点求值,就得到了 的算法。
NOI Online#2 提高组 游戏
和 BZOJ3622 比较相似,考虑钦定 个位置,让这 个位置不是平局。我们将 A 的点染黑,B 的点染白。
现在相当于要选出 组互为祖孙关系的点对,求方案数。
这个可以用树形 DP 做,设 为只考虑点 子树内的点,配 对的方案。
设 为 子树中白点个数, 为 子树中黑点个数,转移时考虑看 是否配对:
- 如果 不配对,那么直接把 的儿子的背包合并上来即可。
- 如果 配对,不妨设 是黑点,此时相当于子树中已经配了 对,那么 还有 种选择。因此将子树内 的背包合并上来再乘 即可。
那么我们可以 算出来钦定 个位置的方案数,再 反演一遍就完事了。AC Code
JSOI2015 染色问题
我们发现这题有三个限制。如果没有限制,那么答案就是 。
考虑设 为钦定某 行,某 列全都空着,某 种颜色不选的方案数,那么 。
然后设 为恰好 行 列 种颜色不选的方案数,有
发现是个三维的二项式反演,我们猜想
从容斥的角度考虑一下,感觉很对。直接做要带个 ,不过不难做到 。AC Code
注意到其实三维中有一维可以直接算出来,所以不难优化到 。。。(我是傻子qaq
ABC266G Yet Another RGB Sequence
考虑钦定 个位置是 RG
,那么还剩 个 R
, 个 G
, 个 B
,方案数可以随便算。
于是就做完了,果然是板子题。
ABC217G Groups
我们考虑对非空这个条件做容斥。
具体来说把 分成 组,第 组中每个数都 ,设其大小为 。
现在我们钦定其中某 组是空的,那么
那么答案可以直接通过二项式反演 得到。
我们发现如果直接算的话需要算 次,每次都要 ,过不去。
但是可以发现本质不同的 其实只有 组,因此直接处理出来所有的
然后算 就只需要查表了。总的复杂度为 。AC Code
CF285E Positions in Permutation
设 表示由 构成的排列,有 个 good position 的方案数,后面两个 的含义待会再说。
我们考虑这样由 的排列构建一个 的排列:先把最后一位放上 ,再将最后一位和前面的某一位 swap 一下。
这样一来,我们只需要分别计算出来有多少种 swap 可以使得 good position 的数量 不变即可。
我们考虑 满足 以及 的值是什么。进行一个分类:
- 如果 和某个 之外的数 swap 了, 那么如果原本那个位置是 good position, 需要减一;否则不变。
- 如果和 进行 swap,那么 会是一个 good position,但是 那个位置原本是不是 good position 我们不知道,因此需要记录一下。
- 如果和 进行 swap,那么 会是一个 good position,但是这个位置原本是不是 good position 我们也不知道,需要记录一下。
因此状态就是:
- 表示由 构成的排列,有 个 good position,第 个位置是不是 ,第 个位置是不是 ,的方案数。
转移分类讨论一下就行了。等等说好的二项式反演在哪里呢
我们思考一下容斥做法:直接钦定某 个位置为 good position,剩下的位置的方案数我们默认为 。
我们发现这个东西类似于一个匹配:
我们把黑边拉直,然后相当于要从 条边中选出 条互不相邻的边。简单插板得到 。
那么我们的 就是 和自己卷一下,答案就是
暴力 计算已经可以通过本题。注意到 是个卷积,因此可以做到 。
CF997C Sky Full of Stars
相信做了之前那么多题之后这题已经非常简单了。。。
考虑钦定某 列是同一种颜色,剩下的随便填,并且需要满足每一行都不是同一种颜色。有
然后二项式反演再做个小容斥就完事了。时间复杂度 或 。AC Code
CF995F Cowmpany Cowmpensation
这题有个拉格朗日插值的做法,不过我们可以用容斥过掉它。
我们发现虽然值域很大,但是实际上用到的数只可能有 种。
设 为恰好用 中每个数填好,并且每种数至少出现一次,的方案数,那么答案就是 。
这是因为我们可以把一种方案离散化掉,那么离散化到 的方案数恰为 。
我们发现至少出现一次看着就很容斥,因此可以求出来 表示只用 中的数,随便填(可以有某些数没有用到)的方案数。
那么 其实就是 二项式反演一下,于是就可以 直接算了。代码懒得写了,,先坑着
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫