容斥原理
省流:小学数学.
来看一道水题!给你拥有 A,B,C,AB,BC,AC,ABC 属性的物体个数,求总物品数.
依照经验,加上有一个属性的,减去有两个属性的,再加上有三个属性的就是答案.容易验证这是正确的!
尝试扩展一下.我们现在有属性全集 U,给你拥有集合 S 中属性的物品数量 fS,求总物品数.
按图索骥,我们可以猜测答案是
S⊆U∑(−1)∣S∣+1fS
容易验证这是对的.我们空降了一个 (−1)∣S∣+1,然后和式就给出了正确的值,看起来很神奇!为啥对来着.
考察一个属性集合为 S 的物品,它会被所有 fT,T⊆S 统计到一遍,那么总共就会被计算
i=1∑∣S∣(i∣S∣)
次.现在我们希望给每个 fS 一个容斥系数 c∣S∣,使得每种物品只会被计算一次,即
∀1≤x≤∣U∣,i=1∑x(ix)ci=1
此时带入 (−1)∣S∣+1 的正确性就可以通过二项式定理轻易得出了!
可惜地,并不是所有问题的容斥系数的形式都这样简单.所以,我们需要了解一些魔术.
反演
本质
反演指的是改变表示的方向,即 f 表示 g → g 表示 f.
假设我们已知系数 ai,j,使得
gn=i=1∑nan,ifi
且能够通过系数 ai,j 反推出一组系数 bi,j,使得
fn=i=1∑nbn,igi
就能知 g 求 f,反之亦然.这一过程称作反演,上述两式互为反演公式.
可以发现,上文提到的容斥系数的构造也是在求解一组互相表示关系.这两者间存在着紧密关联.
第一反演公式
感觉上面都在说批话啊,我不知道咋求系数是不是还是一分不会.
反演牛逼的地方在于 b 只和 a 有关,而和 f 和 g 无关.也就是说如果我们对于某对平凡的 f,g 弄出了一组系数 a,b,那么对于任意数列 p,q 都有:
pn=i=1∑nan,iqi⟺qn=i=1∑nbn,ipi
这看起来很反直觉,为啥一组系数可以对一车有互相表示关系的数列对成立呢.
设 A=(ai,j),B=(bi,j),显然这是两个下三角矩阵.假设这一互相表示关系对数列 p,q 成立,将其写成列向量 p,q,那么上述的关系就能够写成
Ap=q⟺Bq=p
将右侧带入左侧,有 ABq=q,即 AB=I.由于 A 和 B 恒互逆,不随 p,q 改变,这说明了只要我们找到一组符合条件的 a,b,p,q,就能将 p,q 推广.
这同时也给出了一种通用的求容斥系数的方案:把矩阵写出来后直接求逆.但是大部分时候需要求解的范围是 n≤106 甚至 n≤109,直接求逆显然寄飞了.可喜的是前人求出过很多系数对,可以直接用!
不过求逆做法可以拿来打表,还是有点用的!
一些经典的反演 / 容斥系数
大致按照笔者使用的频率排序.
二项式反演
fn=i∑(in)gifn=i∑(ni)gi⟺gn=i∑(in)(−1)n−ifi⟺gn=i∑(ni)(−1)i−nfi
容易看出,下面那个形式本质上是将上面那个形式的系数矩阵转置得到的.
带入 fi=xi,gi=(x−1)i 容易验证正确性.
子集反演
fS=T⊆S∑gTfS=S⊆T∑gT⟺gS=T⊆S∑(−1)∣S∣−∣T∣fT⟺gS=S⊆T∑(−1)∣T∣−∣S∣fT
就是上面说的那个容斥.
可以扩展到可重集,让重复元素的贡献为 0 即可.
Mobius 反演
fn=d∣n∑gdfn=n∣d∑gd⟺gn=d∣n∑μ(n/d)fd⟺gn=n∣d∑μ(d/n)fd
带入 fi=1,gi=[i=1] 容易通过 Dirichlet 卷积验证正确性.
可以看作对质因子构成的可重集做子集反演.
Min-Max 容斥
单位根反演
Stirling 反演
参考
《具体数学》5.1, 6.1
Alex_Wei, 组合数学相关
Alex_Wei, 反演与狄利克雷卷积
VFleaKing, 炫酷反演魔术
command_block, 炫酷反演魔术
RenaMoe, 容斥原理学习笔记
RenaMoe, 笔记 各类反演
Deadecho, 容斥原理,容斥系数