upd:发现之前讲那个 AGC 题的时候讲错了(大体也差不多,推错了),而且集合划分容斥跑题了,故删去并增加更多题目。
前置知识
容斥 / 二项式反演
[n=0]=i=0∑n(in)(−1)i
二项式反演(常用形式):
fi=j=i∑∞(ij)gjgi=j=i∑∞(ij)(−1)j−ifj
其实容斥系数可以试的。另外显然这是在求一个矩阵的逆矩阵,可以暴力求出然后打表。
接下来总结一些我觉得比较好玩的容斥题!
题目描述
设
f(a1,a2,a3,...,am) 为
a 中不同数的个数。
找到所有正整数序列
a 满足
a1+a2+a3+...+am=n 的
f(a1,a2,a3,...,am) 的和。对
998244353 取模。
1≤n≤1018,1≤m≤500,m≤n。
题解
a∑f(a)=p∑a∑[p∈{a}]
对于实际上序列
a 中值为
p 的集合
S,若
S=∅ 就可以产生一点贡献。则根据
[n=0]=i=0∑n(in)(−1)i 可以计算不合法方案。
容斥,枚举大小为
i 的集合
S,并钦定集合中的数全部都是
p。记这种情况统计到的序列数量为
fi 则根据上式答案为
i=1∑n(−1)ifi。
p=1∑ni=1∑m(−1)i(im)(m−i−1n−pi−1)=i=1∑m(−1)i(im)p=1∑n(m−i−1n−pi−1)
最后面一项是
m 次多项式,可以拉格朗日插值。
比较简单的一道题只是做一下铺垫。
先刻画一下,一种方式是记序列
a,b 表示每条边是由
ai→bi。要求
ai=bi,但是还剩下无重边的条件不好刻画。
换个形态,设计长为
2n 的序列
a 进行
i→a2i−1,i→a2i 这样的连边方式,这太对了吧。于是把所有条件刻画出来。
- 无重边:a2i−1=a2i。
- 无自环:i=a2i−1,i=a2i。
- 1∼n 每个数出现两次。
使用类似上一题的写法:
a∑i=1∏n[a2i−1=a2i][i=a2i−1][i=a2i]
为了方便单独拿出里面:
[a2i−1=a2i][i=a2i−1][i=a2i]=(1−[a2i−1=a2i])(1−[i=a2i−1])(1−[i=a2i])=1−[a2i−1=a2i]−[i=a2i−1]−[i=a2i]+2[a2i−1=a2i=i]
想一下这个式子啥意思,额这不是小学奥数韦恩图吗。反正乘法原理就是枚举每个
i 选择这四种贡献的哪一个。接下来的部分和容斥没啥关系先不说。
参考:https://www.luogu.com.cn/article/ez7s5j0w
造计算机
[x][y] 可以造出
x∧y。
1−[x] 可以造出
¬x。
所以感觉这个东西可以造出很多东西啊!有没有相关的题。
题目描述
求由若干个长度为
n 的二进制数(
0∼2n−1)构成的不可重集合
a 的数量,使得对于每一个二进制位,
a 中都至少有两个数在这一位上是
1。
1≤n≤3000。
题解
如法炮制:
a∑i=1∏n[count(a,i)≥2]=a∑i=1∏n(1−[count(a,i)=0]−[count(a,i)=1])
看起来已经可以做了。还是乘法原理。如果选了
[count(a,i)=0] 就是直接丢掉这一位了,不管它。
假设有
j 个数选了
[count(a,i)=1],这些
1 可以分散到若干个数上,这是类似斯特林数的形式。但是还可以有至多一个
0。
然后,在式子里选了
1 的也就是任选的位置可以让一个数分裂成若干个数:如果这是一个全
0 则有
22k−1 种选法否则只是
2k。预处理类似斯特林数的 dp 数组即可快速计算。
二维二项式反演 / 容斥
S1=∅∑S2=∅∑sth.=S1=∅∑T1⊆S1,=∅∑S2=∅∑T2⊆S2,=∅∑(−1)∣T1+T2∣sth.=T1=∅∑T2=∅∑(−1)∣T1+T2∣STH.
CF2048G 题解:https://www.luogu.com.cn/article/2rrj6vur
这可能很简单,跳过。
Min-Max 容斥
我真的理解不了 Min-Max 容斥!其实不需要会!
例题:P4707。题意:有
m 个小球,
n 种颜色,每次选出一个小球并记录颜色再放回袋子里。问你选出
k 种颜色的期望操作次数。
1≤k≤n≤103,
n−k≤10,
1≤m≤104。
考虑拆贡献,拆分成第
i 步只染了
<k 种颜色的概率和。钦定
j 种颜色一定没有染,则发现
l 种未染颜色会产生
(jl) 次贡献,容斥系数和二项式定理一样!推完了。剩余题解去看题解区。
总结:Min-Max 容斥不如拆贡献。
题意:随机一个长度为
n,值域为
[1,m] 的正整数序列,求其中众数的出现次数的期望值。
1≤n≤103,1≤m≤109。
套路的拆贡献,求
maxcnti≥k 的概率之和。
maxcnti≥k 不好求改成
maxcnti<k。然后就相当于有系数:
∏[cnti<k]。
考虑 dp,一种暴力转移是值域从小往大选那
n 个数,可以生成函数,但是可能没啥前途。考虑容斥。
设
fi,j 表示
i 个数值域为
[1,j],众数出现次数
<k 的方案数。
转移首先是这个数任选,从
jfi−1,j 转移,然后钦定这个数为使得某个数出现次数刚好爆掉的时候,此时前
i−1 个数恰好有
k−1 个数与
ai 相同。从
j(k−1i−1)fi−k,j−1 转移。
容易发现
m−j≤kn,复杂度是
O(∑kn2)=O(n2logn) 的。
总结:这个转移的时候容斥有点非常规的。
手玩并注意到一个合法的线段树的合法权值方案为:
若一个点有两个叶子,则这两个叶子的权值不同,满足上述限制的前提下,有
c 种这样的点,则方案为
2c−1。
证明不难。考虑这种东西应该只能用钦定的方法算,钦定若干个权值不同的叶子被合并
a,若干个权值相同的叶子被合并
b。最后方案的
a⊆a′,b⊆b′ 的贡献应该是
[b′=0]2a′。容易发现容斥系数分别为
1 和
−1。
由于“三角剖分等于线段树”可以发现:剩下乱选的方案是卡特兰数。计算合并成
k 个物体的方案数即可。
这是经典问题,分治并 NTT,复杂度 2 log。
考虑
m=0:假设
an+1=C,只需要最后和
an+1=C−1 的方案相减即可得到答案,转化为异或和
=0。
数位 dp。枚举所有数与上界的 LCP 的最小值,后面会有一个数开始失控,第一次失控后面的达成条件方案数都可以直接算出,
O(nlogV)。
考虑
m>0:容斥,选择一些边强制钦定相等,容斥系数
−1,划分成了若干个连通块,每个连通块内限制为
a 的最小值的限制。
预处理联通块内的容斥系数和,这可以使用集合幂级数
ln 或者暴力
O(3n)。我们也要暴力算出由连通块内最小值所构成的集合,每一个都做一遍“问题
m=0”。
记录
fS,T 表示当前连通块集合为
S,最小值集合为
T。复杂度
4n。但是有说法是合并联通块的状态只有
n2n 种。
O(n3n)。
具体说法一下。首先先给
a 排序。然后是按照最小值从小往大转移。我们需要记录当前选了哪些数和已经选了哪些最小值。
转移时,非最小值除外,剩下的位置最小值一定选了一个序列上的前缀,可以使用最大的最小值位置记录。则只需要记录非最小值的集合和最大的最小值位置,信息量
O(n2n)。转移暴力合并。