目录
一些容斥原理
规定
本文中集合指代非可重集。
用大写字母记一个集合,例如 P,S。
在集合两侧加竖线表示集合的大小,例如 |{1,2,3,4,5}|=5。
在有上下文信息的情况下,直接写出集合也可以表示该集合对应的一类贡献,其与集合内元素线性相关。
下文中在描述下标集合时常会看到 S,T 这两个用于枚举的中间量集合,这里记 S 表示下标全集,T 表示当前枚举到的 S 的一个子集。
规定 00=1,这也是有实际意义的。
容斥原理
就是最普适的容斥原理了。我们需要计算一系列集合的并,但又不希望重叠部分的贡献计入多次,这时就需要通过多次计数,每次[把先前没有计算的部分容纳进来/把先前重复计算的部分排斥出去],定量地加以容斥系数来实现不重不漏的计数,这样的做法就叫容斥原理。
假设我们需要计数集合列 ⟨Pn⟩ 的贡献,容易得到
⋃i∈SPi=∑T⊆S(−1)|T|−1⋂j∈TPj
该式子描述了容斥原理的核心,其他的容斥可以说都是从这个式子上衍生的。
证明也是比较方便的。考虑一个元素在集合列中的 m 个集合中出现,则可以发现,选择 k 个其出现的集合有 Ckm 种可能,每种可能的系数是 (−1)k−1。最后能写出
m∑i=1(−1)i−1(mi)=(m0)−(1−1)m=1
也可以通过归纳法证明。
集合的交的问题可以转化成集合的并来解决,就是全集减去补集的并。
Min-Max 容斥
对于一个元素之间满足全序关系且有加减性的元素列 {xi},设其大小为 n,则我们有以下关系:
maxi∈Sxi=∑T⊆S(−1)|T|−1minj∈Txj
mini∈Sxi=∑T⊆S(−1)|T|−1maxj∈Txj
证明就是讨论元素贡献。取 m∈S,假设 xm 是第 k 大的元素,则可以讨论 xk 会作为哪些集合的元素出现。
- k=1
我们需要的就是 xm,容易发现它只会在 {xm} 这一个集合中作为最小值出现。
所以它的贡献就是 (−1)0xm=xm。
- k>1
最小的元素是第 k 大的元素,那其余元素只能是第 l<k 大的元素了,这样的元素一共有 k−1 个。
可以写出选择 i+1 个的贡献系数,也就是k−1∑i=0(k−1i)(−1)i−1=(1−1)k−1=0
因此最后的贡献是第一小的数,即 maxi∈Sxi。最小值可以如上地证明。
因此得证。
Min-Max 容斥之所以有用,其中一个原因是它在期望上也成立:众所周知在期望意义下的 max,min 是不像普通的 max,min 那么好求的,需要做转化。写出式子:
E(maxi∈Sxi)=∑T⊆S(−1)|T|−1E(minj∈Txj)
E(mini∈Sxi)=∑T⊆S(−1)|T|−1E(maxj∈Txj)
证明:
可以通过枚举可能的 y 序列写出一种期望的表示方法:
E(maxi∈Sxi)=∑yP(y=x)maxj∈Syj
可以发现后面的部分就可以直接施上面的 Min-Max 容斥公式了。也就是
E(maxi∈Sxi)=∑yP(y=x)maxj∈Syj=∑yP(y=x)∑T⊆S(−1)|T|−1minj∈Tyj=∑T⊆S(−1)|T|−1∑yP(y=x)minj∈Tyj=∑T⊆S(−1)|T|−1E(mini∈Sxi)
因此得证。
考虑到上面的容斥,我们不难想到,是否通过一些其他的容斥系数来转化到组合数求和上,从而指向性地得到第 k 大和第 k 小。这是可行的,而且我们也可以通过对应公式转化到期望上。这个东西又叫做拓展 Min-Max 容斥。
写出:
k-thmaxi∈Sxi=∑T⊆S(−1)|T|−k(|T|−1k−1)minj∈Txj
k-thmini∈Sxi=∑T⊆S(−1)|T|−k(|T|−1k−1)maxj∈Txj
E(k-thmaxi∈Sxi)=∑T⊆S(−1)|T|−k(|T|−1k−1)E(minj∈Txj)
E(k-thmini∈Sxi)=∑T⊆S(−1)|T|−k(|T|−1k−1)E(maxj∈Txj)
不妨设 xi≤xi+1。我们化式子:
∑T⊆S(−1)|T|−k(|T|−1k−1)minj∈Txj=∑i∈Sxi∑T⊆S(−1)|T|−k(|T|−1k−1)[xi=minj∈Txj]=∑i∈Sxin∑j=k(−1)j−k(j−1k−1)(n−ij−1)=∑i∈Sxin∑j=k(−1)j−k(n−ik−1)(n−i−(k−1)j−1−(k−1))=∑i∈Sxin∑j=k(−1)j−k(n−ik−1)(n−i−k+1j−k)=∑i∈Sxi(n−ik−1)n∑j=k(−1)j−k(n−i−k+1j−k)=∑i∈Sxi(n−ik−1)∑j≥0(−1)j(n−i−k+1j)=∑i∈Sxi(n−ik−1)(1−1)n−k+1−i
可以发现 Ck−1n−i0n−k+1−i=1 当且仅当 i=n−k+1,其余情况都是 0。这就是第 k 大值。
其余三个可以类似上面地证明,不再赘述。
因此得证。
可以发现这个东西能够应用到一个数字质因子的指数上,这自然引出了质因子取 min,max 的操作:gcd,lcm。
我们类比地转化操作,有:
lcmi∈Sxi=∏T⊆S(gcdj∈Txj)(−1)|T|−1
这个式子可以叫 gcd-lcm 容斥/反演。
例题:
[HAOI2015] 按位或 - 期望上的 Min-Max 容斥;
bzoj4833 最小公倍佩尔数 - gcd-lcm 容斥;
重返现世 - 拓展 Min-Max 容斥;
[PKUWC2018] 随机游走 - 对顺序进行期望上的 Min-Max 容斥;
Become Big For Me - gcd-lcm 容斥(以及出题人的推荐.
一些反演
规定
记一个元素列 f 的第 i 个元素为 f[i]。记一个矩阵 A 第 i 行第 j 列的元素为 A[i,j]。
一个元素列 f 对应的向量为 f。
反演是什么?
我们考虑两个元素列 f,g 之间的双向关系,这一对关系就叫做反演关系。例如前缀和与差分、倍数求和与倍数差分等。一般地,这类关系是线性的,可以采用一个矩阵 A 和它的逆来描述,这矩阵又叫做关系矩阵。
一般地,我们可以得到一个关系对应的矩阵 A,则 f→g 的关系可以经由
f[k]=∑i≥0A[k,i]×g[i]
来描述,也就是 f=Ag。
我们已经可以通过 g 计算 f 了,而现在需要用 f 计算 g。这样一个过程就叫做反演。不难想到求 A 的逆矩阵 A−1,则 g=A−1f。
例如前缀和矩阵是 A[i,j]=[i≥j],而我们通过求逆能看到 A−1[i,j]=[i=j]−[i=j+1]。由定义不难发现两个互为反演关系的关系矩阵互逆。
我们也可以通过这类定义来从原有的反演上得到新的反演。具体地,有以下几条方法:
- 应用转置,容易发现一对互逆矩阵的转置也互逆。
- 可以对两个矩阵分别乘以 c≠0,容易发现这两个矩阵仍然互逆。(这里是一个乘 c 一个除 c 的意思吗?)
- 移动 (−1)k 的指数。我们有
∑i≥0(−1)n−iA[n,i]×B[i,m]=[n=m]⇔∑i≥0(−1)iA[n,i]×(−1)mB[i,m]=[n=m]
可以用在一些出现了 (−1)n−k 的时候,比方说二项式反演。
由一维情况可以拓展到二维情况。假设我们有两个关系矩阵 A,B,他们分别描述了 i,j 两维的反演信息。我们有这两个关系上矩阵 F,G 的二维反演:
F[n,m]=∑i≥0∑j≥0A[n,i]×B[m,j]×G[i,j] ⇔ G[n,m]=∑i≥0∑j≥0A−1[n,i]×B−1[m,j]×F[i,j]
发现这就是各维反演系数的乘积。
证明可以构造四维矩阵。
不妨构造 C[(i,k),(j,l)]=A[i,j]×B[k,l],D[(i,k),(j,l)]=A−1[i,j]×B−1[k,l]。我们需要证明的就是 C×D=I,也就是 (C×D)[(i,j),(k,l)]=[(i,j)=(k,l)]。
(C×D)[(i,j),(k,l)]=∑(t1,t2)C[(i,j),(t1,t2)]×D[(t1,t2),(k,l)]=∑(t1,t2)A[i,t1]×B[j,t2]×A−1[t1,k]×B−1[t2,l]=∑t1A[i,t1]×A−1[t1,k]∑t2B[j,t2]×B−1[t2,l]=[i=k]×[j=l]=[(i,j)=(k,l)]
因此得证。
由二维情况可以拓展到多维情况,证明类似,不再赘述。
二项式反演
最基础也最常见的反演。
首先写出第一种形式:
f(n)=n∑i=0(−1)i(ni)g(i)⇔g(n)=n∑i=0(−1)i(ni)f(i)
这依赖着 A[n,m]=(−1)mCnm 这个矩阵是自逆的。
证明可以写一下 A×A 的形式。也就是
(A×A)[n,m]=∑i≥0A[n,i]×A[i,m]=∑i≥0(−1)i(ni)×(−1)m(im)=(−1)m∑i≥0(−1)i(ni)(im)=(−1)m∑i≥0(−1)i(nm)(n−mi−m)=(−1)m(nm)∑i≥0(−1)i(n−mi−m)=(−1)m(nm)∑i≥0(−1)i+m(n−mi)=(nm)∑i≥0(−1)i(n−mi)=(nm)0n−m=[n=m]
我这个证法挺简洁?
然后用上面提过的移动 (−1)n−k 可以得到
f(n)=n∑i=0(ni)g(i)⇔g(n)=n∑i=0(−1)n−i(ni)f(i)
这个东西也可以 egf 来证。也就是
f(n)n!=n∑i=01(n−i)!g(i)i!
DNA 动了嘛?构造 f,g 的 egf F,G,则 F=ex×G,也就能导出 G=e−x×F,化一下就能到右边了。
然后用上面提过的转置可以得到
f(n)=∑i≥n(in)g(i)⇔g(n)=∑i≥n(−1)i−n(in)f(i)
然后用上面提过的移动 (−1)n−k 可以得到
f(n)=∑i≥n(−1)i(in)g(i)⇔g(n)=∑i≥n(−1)i(in)f(i)
这也就是经典的四种式子了。
例题(难度大概逐渐递增?看出题时间和来源也是):
[NOI Online #2 提高组] 游戏;
已经没有什么好害怕的了
[HAOI2018] 染色;
[TJOI2019] 唱、跳、rap和篮球;
[MtOI2018] 情侣?给我烧了!;
[CTS2019] 随机立方体.
莫比乌斯反演
这个东西是数论相关知识。
我们现在想要研究一个函数在某一点值的所有因数处的取值,也就是转移矩阵 A[n,d]=[d|n]。对这个转移矩阵求逆可以得到 A−1[n,d]=[d|n]×μ(nd)。这个东西的证明是数论知识,具体着眼于这样一个结构上。
我们定义 μ 函数为满足 ∑d|nμ(d)=[n=1] 的函数。我们可以通过这个定义写出 μ(n) 的取值:
μ(n)=⎧⎪⎨⎪⎩1 ,n=10 ,n 有平方因子(−1)k ,k 为 n 本质不同质因子个数
这个定义的导出参见 Min-Max 容斥的容斥系数设计。
于是我们可以写出反演关系:
f(n)=∑d|ng(d)⇔g(n)=∑d|nf(d)μ(nd)
然后用上面提过的转置可以得到
f(n)=∑n|dg(d)⇔g(n)=∑n|df(d)μ(dn)
后面的知识可以看莫比乌斯反演应用,杜教筛,贝尔级数。
斯特林反演
这一点用到了两类斯特林数之间的关系。
首先介绍一下两类斯特林数以及他们的一些性质。前置性质;前置(后置?)性质。
第一类斯特林数 [nm]:n 个元素分为 m 个环的方案数(旋转后相同的算一个环)。
递推公式:[nm]=[n−1m−1]+(n−1)[n−1m]
可以考虑如何插入一个新的元素,也就是[自己成新的环/插入原有的环],每个环的插入点和环大小相同,因此总共有 n−1 个彼此不同的插入点,乘 (n−1)。
行的 ogf:x¯¯¯n=∑k≥0[nk]xk
归纳法即得。从其中我们还能知道当 x=1 时有 n!=∑k≥0[nk]
列的 egf:(−ln(1−x))kk!=∑n≥0[nk]xnn!
对 k 个环排列做一下直接组合即得。
二元 gf(上标 egf,下标 ogf):
(1−x)−y=∑i≥0∑j≥0[ij]xiyji!
推导仍然可以考虑对环排列组合,再用一个额外的占位元记录组合进来的个数。
容易写出环排列的 egf 是 −ln(1−x),那不妨记录单个环排列是 −yln(1−x)。对它做 exp 即得 (1−x)−y。
第二类斯特林数 {nm}:n 个不同元素放入 m 个相同的盒子,无空盒的方案数。
递推公式:{nm}={n−1m−1}+m{n−1m}
可以考虑如何插入一个新的元素,也就是[自己成新的环/插入原有的环],每个盒的插入等价,因此总共有 m 个彼此不同的插入点,乘 m。
列的 egf:(ex−1)kk!=∑n≥k{nk}xnn!
和上面类似的做法。
二元 gf(上标 egf,下标 ogf):
exp(y(ex−1))=∑i≥0∑j≥0{ij}xiyji!
这个形式就更显然了是吧。
有一个生成单位元的公式,在一些情况下有用:
n∑k=m{nk}[km](−1)k−m=[n=m]
都说到这了就再说说斯特林数参与的普通幂和阶乘幂的转换吧。
直接给出公式:
xn=n∑k=1{nk}xk––=n∑k=1(−1)n−k{nk}x¯¯¯k
xn––=n∑k=1(−1)n−k[nk]xkx¯¯¯n=n∑k=1[nk]xk
然后就是斯特林反演的经典形式了。
f(n)=n∑i=0{ni}g(i)⇔g(n)=n∑i=1(−1)n−i[ni]f(i)
这里当然能用单位元替代的性质来做,但是直接用 egf 代换也行。由第一个式子是可以推出 f,g 的 egf 的关系的,设二者是 F,G,则我们能得到 F(x)=G(ex−1),然后就是 G(x)=F(ln(1+x)),展开即可得到右边。
繁而不难,留作读者练习。
然后就是几个由移动 −1 和转置矩阵得到的公式:
f(n)=n∑i=0(−1)n−i{ni}g(i)⇔g(n)=n∑i=1[ni]f(i)
f(n)=n∑i=0(−1)i{ni}g(i)⇔g(n)=n∑i=1(−1)i[ni]f(i)
f(n)=∑i≥n{in}g(i)⇔g(n)=∑i≥n(−1)i−n[in]f(i)
f(n)=∑i≥n(−1)i−n{in}g(i)⇔g(n)=∑i≥n[in]f(i)
例题:
明明的随机数(校内题(弱化版;
CF932E(不是很反演;
CF960G(不是很反演;
bzoj4671 异或图;
[HEOI2016/TJOI2016] 求和;
[国家集训队] Crash 的文明世界.
单位根反演
单位根是啥?
注意:我们这里的讨论是在 C 上的,其也可以通过一些方式映射到 Fp 上,其中 p 是质数。
记 i=√−1,虚数单位。
n 次单位根,是 xn=1 在复数域上的 n 个解,第 k∈[0,n) 个解可以写作
e2πki/n=cos(2knπ)+isin(2knπ)
我们记第 i 个 n 次单位根为 ωin。ω0n=1;任意单位根都是 ω1n 的倍数,它常省略右上角角标 1。
扔到 Fp 上的话就是 xn≡1(modp) 的 n 个解,但有可能不成立,具体判断方法看下面的构造。
我们设 p 的一个原根是 g,则我们有 ωn=g(p−1)/n。可以发现这样构造出来的 ωn 是满足要求的。
单位根反演的公式如下:
[n|a]=1nn−1∑k=0ωakn
证明考虑分讨。
当 a≢0(modn) 时我们可以等比数列求和,得到右侧就是 1nωann−1ωan−1=1n1−1ωan−1=0
当 a≡0(modn) 时发现等比数列公比为 1,能得到右侧就是 1n∑n−1k=0ω0n=1。
可以导出下式:
[a≡b (mod n)]=1nn−1∑i=0ω(a−b)kn
例题:
LJJ 学二项式定理;
小猪佩奇学数学;
[集训队作业2018] 复读机;
[HNOI2019] 白兔之舞.
参考资料:
炫酷反演魔术, command_block ;
Min-Max 容斥小记, command_block ;
多项式计数杂谈, command_block ;
浅谈斯特林数及斯特林反演, y2823774827y ;
单位根反演小记, command_block ;
容斥与反演, juju527 ;
容斥原理 - Min-Max 容斥, oi-wiki, Peanut-Tang et al. .
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)