小 游 者 , 真 神 人 也 , 左 马 桶 , 右 永 神 , 会 执 利 笔 破 邪 炁 , 何 人 当 之 ? A small swimmer is a God. The left toilet and the right eternal God can break the evil energy with a sharp pen. Who can resist him? 小 遊 者 は 、 神 で あ り 、 左 便 器 、 右 永 神 で あ り 鋭 い ペ ン を 持 っ て 真 実 を 突 き 刺 し て い る 。 誰 が 彼 に 抵 抗 で き る だ ろ う か ? Petit voyageur, est Dieu aussi, toilettes gauche, Dieu é ternel droit, peut tenir un stylo tranchant pour briser le mal, qui devrait le faire? Der Direktor ist wirklich ein Gott mit einer Toilette links und Yongshen rechts der einen spitzen Stift h ä lt um die Wahrheit zu durchdringen. Wer kann ihm widerstehen? Ein kleiner Schwimmer ist ein Gott. Die linke Toilette und der rechte ewige Gott k ö nnen die b ö se Energie mit einem scharfen Stift brechen. Wer sollte es sein? 对 曰 : “ 无 人 , 狗 欲 当 之 , 还 请 赐 教 ! ” 小游者,真神人也,左马桶,右永神,会执利笔破邪炁,何人当之? A small swimmer is a God. The left toilet and the right eternal God can break the evil energy with a sharp pen. Who can resist him? 小遊者は、神であり、左便器、右永神であり 鋭いペンを持って真実を突き刺している。誰が彼に抵抗できるだろうか? Petit voyageur, est Dieu aussi, toilettes gauche, Dieu éternel droit, peut tenir un stylo tranchant pour briser le mal, qui devrait le faire? Der Direktor ist wirklich ein Gott mit einer Toilette links und Yongshen rechts der einen spitzen Stift hält um die Wahrheit zu durchdringen. Wer kann ihm widerstehen? Ein kleiner Schwimmer ist ein Gott. Die linke Toilette und der rechte ewige Gott können die böse Energie mit einem scharfen Stift brechen. Wer sollte es sein? 对曰:“无人,狗欲当之,还请赐教!”
部分内容也是 2013 年国家集训队论文《浅谈容斥原理》中的。还有一些来源于《炫酷反演魔术》。另外有一些来源于 Q u a c k Q u a c k 的课件,最后还有一些杂烂文章就是来源于我自己了......
不一定完结,随机更新。
基本容斥
假设有 n n 个性质 P 1 , P 2 , ⋯ , P n P 1 , P 2 , ⋯ , P n ,在全集 U U 中满足这些性质的元素分别为 S 1 , S 2 , ⋯ , S n S 1 , S 2 , ⋯ , S n .
最基本的容斥形式如下:
∣ ∣
∣ ∣ n ⋃ i = 1 S i ∣ ∣
∣ ∣ = ∑ i | S i | − ∑ i < j | S i ∩ S j | + ∑ i < j < k | S i ∩ S j ∩ S k | − ⋯ + ( − 1 ) n − 1 | S 1 ∩ S 2 ∩ S 3 ⋯ ∩ S n | | ⋃ i = 1 n S i | = ∑ i | S i | − ∑ i < j | S i ∩ S j | + ∑ i < j < k | S i ∩ S j ∩ S k | − ⋯ + ( − 1 ) n − 1 | S 1 ∩ S 2 ∩ S 3 ⋯ ∩ S n |
考虑一个属于 T 1 , T 2 ⋯ , T m T 1 , T 2 ⋯ , T m 的元素会被计算多少次:
m ∑ i = 1 ( − 1 ) i − 1 ( m i ) = − ( ( 1 − 1 ) m − 1 ) = 1 ∑ i = 1 m ( − 1 ) i − 1 ( m i ) = − ( ( 1 − 1 ) m − 1 ) = 1
然后,我们可以稍加推广,得到另外的一个形式:
∣ ∣
∣ ∣ n ⋂ i = 1 S i ∣ ∣
∣ ∣ = | U | − ∣ ∣
∣ ∣ n ⋃ i = 1 ¯ S i ∣ ∣
∣ ∣ | ⋂ i = 1 n S i | = | U | − | ⋃ i = 1 n S i ¯ |
举个例子:错位排列。
对于性质 P i P i ,其表示 σ i ≠ i σ i ≠ i ,而我们的目标是求 ∣ ∣
∣ ∣ n ⋂ i = 1 S i ∣ ∣
∣ ∣ | ⋂ i = 1 n S i | ,根据上面的容斥形式,需要用到 ¯ S i S i ¯ ,其表示满足 σ i = i σ i = i 的所有排列,此时我们可以进行容斥了:
∣ ∣
∣ ∣ n ⋂ i = 1 S i ∣ ∣
∣ ∣ = | U | − ∣ ∣
∣ ∣ n ⋃ i = 1 ¯ S i ∣ ∣
∣ ∣ = n ! − n ∑ t = 1 ( − 1 ) t − 1 ∑ i 1 < i 2 < i 3 ⋯ < i t ∣ ∣
∣ ∣ t ⋂ k = 1 S i k ∣ ∣
∣ ∣ = n ! − n ∑ t = 1 ( − 1 ) t − 1 ∑ i 1 < i 2 < i 3 ⋯ < i t ( n − t ) ! = n ! − n ∑ t = 1 ( − 1 ) t − 1 ( n t ) ( n − t ) ! = n ! − n ∑ t = 1 ( − 1 ) t − 1 n ! t ! = n ! + n ∑ t = 1 ( − 1 ) t n ! t ! = n ! n ∑ t = 0 ( − 1 ) t n ! t ! | ⋂ i = 1 n S i | = | U | − | ⋃ i = 1 n S i ¯ | = n ! − ∑ t = 1 n ( − 1 ) t − 1 ∑ i 1 < i 2 < i 3 ⋯ < i t | ⋂ k = 1 t S i k | = n ! − ∑ t = 1 n ( − 1 ) t − 1 ∑ i 1 < i 2 < i 3 ⋯ < i t ( n − t ) ! = n ! − ∑ t = 1 n ( − 1 ) t − 1 ( n t ) ( n − t ) ! = n ! − ∑ t = 1 n ( − 1 ) t − 1 n ! t ! = n ! + ∑ t = 1 n ( − 1 ) t n ! t ! = n ! ∑ t = 0 n ( − 1 ) t n ! t !
化简的关键在于我们发现无论取多少个集合的交,交的大小都只和集合个数有关,这也是错排的通项公式是非指数级的关键。
二项式反演
前面的公式,其核心还是最开始那个证明的式子:
m ∑ i = 1 ( − 1 ) i − 1 ( m i ) = − ( ( 1 − 1 ) m − 1 ) = 1 ∑ i = 1 m ( − 1 ) i − 1 ( m i ) = − ( ( 1 − 1 ) m − 1 ) = 1
如果你再细心一点,将会发现,同一行的组合数交错和为 0 0 ,即:
m ∑ i = 0 ( − 1 ) i ( m i ) = 0 ∑ i = 0 m ( − 1 ) i ( m i ) = 0
严谨地,实际上
m ∑ i = 0 ( − 1 ) i ( m i ) = [ m = 0 ] ∑ i = 0 m ( − 1 ) i ( m i ) = [ m = 0 ]
再来看看前面的错排,如果设 f ( n ) f ( n ) 表示任意一个排列方案数,g ( n ) g ( n ) 表示满足了 P P 中的 n n 个的方案数,那么,我们枚举到底是哪 n n 个错开,就可以由 g g 得到 f f :
f ( n ) = n ∑ i = 0 ( n i ) g ( i ) f ( n ) = ∑ i = 0 n ( n i ) g ( i )
现在的问题是:f ( n ) = n ! f ( n ) = n ! ,而 g ( n ) g ( n ) 不知道,也就是说,我们想要从 f f 推到 g g ,但是目前只能由 g g 得到 f f .
但是没有关系,推一推式子,设 g ( n ) = n ∑ i = 0 ( n i ) λ ( i ) f ( i ) g ( n ) = ∑ i = 0 n ( n i ) λ ( i ) f ( i ) ,其中 λ ( i ) λ ( i ) 表示容斥系数,那么
g ( n ) = n ∑ i = 0 λ ( i ) ( n i ) i ∑ j = 0 ( i j ) g ( j ) = n ∑ i = 0 i ∑ j = 0 λ ( i ) ( n i ) ( i j ) g ( j ) = n ∑ i = 0 i ∑ j = 0 λ ( i ) ( n j ) ( n − j i − j ) g ( j ) = n ∑ j = 0 ( n j ) n ∑ i = j λ ( i ) ( n − j i − j ) g ( j ) g ( n ) = ∑ i = 0 n λ ( i ) ( n i ) ∑ j = 0 i ( i j ) g ( j ) = ∑ i = 0 n ∑ j = 0 i λ ( i ) ( n i ) ( i j ) g ( j ) = ∑ i = 0 n ∑ j = 0 i λ ( i ) ( n j ) ( n − j i − j ) g ( j ) = ∑ j = 0 n ( n j ) ∑ i = j n λ ( i ) ( n − j i − j ) g ( j )
然后就会发现,需要满足 ( n j ) n ∑ i = j λ ( i ) ( n − j i − j ) = [ j = n ] = [ n − j = 0 ] ( n j ) ∑ i = j n λ ( i ) ( n − j i − j ) = [ j = n ] = [ n − j = 0 ] ,显然 ( n j ) ≠ 0 ( j ∈ [ 0 , n ] ∩ Z ) ( n j ) ≠ 0 ( j ∈ [ 0 , n ] ∩ Z ) ,因此,n ∑ i = j λ ( i ) ( n − j i − j ) = [ j = n ] = [ n − j = 0 ] ∑ i = j n λ ( i ) ( n − j i − j ) = [ j = n ] = [ n − j = 0 ] ,于是:
n ∑ i = j λ ( i ) ( n − j i − j ) = n − j ∑ i = 0 ( − 1 ) i ( n − j i ) ⇒ n − j ∑ i = 0 λ ( i + j ) ( n − j i ) = n − j ∑ i = 0 ( − 1 ) i ( n − j i ) ∑ i = j n λ ( i ) ( n − j i − j ) = ∑ i = 0 n − j ( − 1 ) i ( n − j i ) ⇒ ∑ i = 0 n − j λ ( i + j ) ( n − j i ) = ∑ i = 0 n − j ( − 1 ) i ( n − j i )
因此,λ ( i + j ) = ( − 1 ) i λ ( i + j ) = ( − 1 ) i ,即 λ ( i ) = ( − 1 ) i − j λ ( i ) = ( − 1 ) i − j ,你发现消不了 − j − j 这一项,但是没有关系,可以将右边的 ( − 1 ) i ( − 1 ) i 改写成 ( − 1 ) n − j − i ( − 1 ) n − j − i ,此时你会发现 λ ( i + j ) = ( − 1 ) n − i − j λ ( i + j ) = ( − 1 ) n − i − j ,因此 λ ( i ) = ( − 1 ) n − i λ ( i ) = ( − 1 ) n − i .
其实还有更简单的证明:
f ( n ) = n ∑ i = 0 n ! i ! ( n − i ) ! g ( i ) ⇒ f ( n ) n ! = n ∑ i = 0 g ( i ) i ! × 1 ( n − i ) ! f ( n ) = ∑ i = 0 n n ! i ! ( n − i ) ! g ( i ) ⇒ f ( n ) n ! = ∑ i = 0 n g ( i ) i ! × 1 ( n − i ) !
因此,有
^ F = ^ G × e x ⇒ ^ G = ^ F × e − x ⇒ g ( n ) n ! = n ∑ i = 0 ( − 1 ) n − i ( n − i ) ! f ( i ) i ! ⇒ g ( n ) = n ∑ i = 0 ( − 1 ) n − i ( n i ) f ( i ) F ^ = G ^ × e x ⇒ G ^ = F ^ × e − x ⇒ g ( n ) n ! = ∑ i = 0 n ( − 1 ) n − i ( n − i ) ! f ( i ) i ! ⇒ g ( n ) = ∑ i = 0 n ( − 1 ) n − i ( n i ) f ( i )
两步解决(
至此,我们得到了二项式反演的一个形式:
f ( n ) = n ∑ i = 0 ( n i ) g ( i ) ⇔ g ( n ) = n ∑ i = 0 ( − 1 ) n − i ( n i ) f ( i ) f ( n ) = ∑ i = 0 n ( n i ) g ( i ) ⇔ g ( n ) = ∑ i = 0 n ( − 1 ) n − i ( n i ) f ( i )
另外一个形式:
f ( n ) = n ∑ i = 0 ( − 1 ) i ( n i ) g ( i ) ⇔ g ( n ) = n ∑ i = 0 ( − 1 ) i ( n i ) f ( i ) f ( n ) = ∑ i = 0 n ( − 1 ) i ( n i ) g ( i ) ⇔ g ( n ) = ∑ i = 0 n ( − 1 ) i ( n i ) f ( i )
数论中的容斥原理
考察 φ ( n ) = | { x | 1 ≤ x ≤ n ∧ gcd ( x , n ) = 1 } | φ ( n ) = | { x | 1 ≤ x ≤ n ∧ gcd ( x , n ) = 1 } | ,要计算 φ ( n ) φ ( n ) ,我们可以用 n = c ∏ i = 1 p t i i n = ∏ i = 1 c p i t i 中 n n 的所有质因子来进行容斥 —— 因为所谓 gcd ( x , n ) = 1 gcd ( x , n ) = 1 ,实际上就是 x x 不含有任何一个 p i p i ,定义性质 P i P i 表示元素不含有质因子 p i p i ,那么,目标是 ∣ ∣
∣ ∣ c ⋂ i = 1 S i ∣ ∣
∣ ∣ | ⋂ i = 1 c S i | ,又可以进行容斥:
φ ( n ) = ∣ ∣
∣ ∣ c ⋂ i = 1 S i ∣ ∣
∣ ∣ = | U | − ∣ ∣
∣ ∣ c ⋃ i = 1 ¯ S i ∣ ∣
∣ ∣ = n − ∑ i n p i + ∑ i < j n p i p j − ⋯ + ( − 1 ) c n ∏ c i = 1 p i ⇒ φ ( n ) = n n ∏ i = 1 ( 1 − 1 p i ) φ ( n ) = | ⋂ i = 1 c S i | = | U | − | ⋃ i = 1 c S i ¯ | = n − ∑ i n p i + ∑ i < j n p i p j − ⋯ + ( − 1 ) c n ∏ i = 1 c p i ⇒ φ ( n ) = n ∏ i = 1 n ( 1 − 1 p i )
这就是欧拉公式了。
当然,如果你足够细心,你会发现我们实际上只在质数上进行容斥,并且在容斥的过程中,取的质数次数均为一次,因此这些质数任意选出一些,他们的乘积仍然是一个__无平方因子数__,而无平方因子数的容斥系数,显然只和其含有多少个质因数有关,因此,我们可以在正整数集上,再定义一个专门针对无平方因子数的函数,它的正负号取决于无平方因子数含有的质数个数,这样,我们就得到了莫比乌斯函数:
μ ( n ) = ⎧ ⎪
⎪
⎪
⎪ ⎨ ⎪
⎪
⎪
⎪ ⎩ 1 n = 1 ( − 1 ) k n = ∏ k i = 1 p i 0 otherwise μ ( n ) = { 1 n = 1 ( − 1 ) k n = ∏ i = 1 k p i 0 otherwise
因此我们可以得到另外的一个关于 φ ( n ) φ ( n ) 的表达式:φ ( n ) = ∑ d ∣ n μ ( d ) n d φ ( n ) = ∑ d ∣ n μ ( d ) n d .
概率论中的容斥
对于__同一概率空间中__的事件 A 1 , A 2 , ⋯ , A n A 1 , A 2 , ⋯ , A n ,依然存在相似的容斥原理:
P ( n ⋃ i = 1 A i ) = ∑ i P ( A i ) − ∑ i < j P ( A i ∩ A j ) + ∑ i < j < k P ( A i ∩ A j ∩ A k ) − ⋯ + ( − 1 ) n − 1 P ( n ⋂ i = 1 A i ) P ( ⋃ i = 1 n A i ) = ∑ i P ( A i ) − ∑ i < j P ( A i ∩ A j ) + ∑ i < j < k P ( A i ∩ A j ∩ A k ) − ⋯ + ( − 1 ) n − 1 P ( ⋂ i = 1 n A i )
对于概率只和事件个数有关,那么还可以简化为:
P ( n ⋃ i = 1 A i ) = n ∑ i = 1 ( − 1 ) i − 1 ( n i ) a i P ( ⋃ i = 1 n A i ) = ∑ i = 1 n ( − 1 ) i − 1 ( n i ) a i
一般形式的容斥原理
对于两个关于集合的函数 f ( S ) , g ( S ) f ( S ) , g ( S ) ,若
f ( S ) = ∑ T ⊂ S g ( T ) f ( S ) = ∑ T ⊂ S g ( T )
那么就有
g ( S ) = ∑ T ⊂ S ( − 1 ) | S | − | T | f ( T ) g ( S ) = ∑ T ⊂ S ( − 1 ) | S | − | T | f ( T )
另外一个形式:
f ( S ) = ∑ T ⊃ S g ( T ) ⇔ g ( S ) = ∑ T ⊃ S ( − 1 ) | S | − | T | f ( T ) f ( S ) = ∑ T ⊃ S g ( T ) ⇔ g ( S ) = ∑ T ⊃ S ( − 1 ) | S | − | T | f ( T )
这个形式只需要将上面取补集即可。
这两个东西也被称为子集反演。
MinMax容斥(MinMax反演)
这个东西就是可以让 min min 和 max max 到处换过来换过去。最基本的式子:
max ( S ) = ∑ T ⊂ S ( − 1 ) | T | + 1 min ( T ) min ( S ) = ∑ T ⊂ S ( − 1 ) | T | + 1 max ( T ) max ( S ) = ∑ T ⊂ S ( − 1 ) | T | + 1 min ( T ) min ( S ) = ∑ T ⊂ S ( − 1 ) | T | + 1 max ( T )
证明就考虑每一项是否能对上,由于两个式子长得差不过,就证上面那个。
考虑当前元素是 S S 中第 k k 大的,那么这个元素左边的系数就是 [ k = 1 ] [ k = 1 ] ,右边的系数,它要作为 T T 中最小的,就是只在它或者比它大的元素中选,因此右边的系数是 k ∑ i = 1 ( − 1 ) i + 1 ( k − 1 i − 1 ) = k − 1 ∑ i = 0 ( − 1 ) i + 2 ( k − 1 i ) = k − 1 ∑ i = 0 ( − 1 ) i ( k − 1 i ) = [ k − 1 = 0 ] = [ k = 1 ] ∑ i = 1 k ( − 1 ) i + 1 ( k − 1 i − 1 ) = ∑ i = 0 k − 1 ( − 1 ) i + 2 ( k − 1 i ) = ∑ i = 0 k − 1 ( − 1 ) i ( k − 1 i ) = [ k − 1 = 0 ] = [ k = 1 ] ,得证。
它还可以推广为 k t h m a x k t h m a x ,设 kthmax ( S ) kthmax ( S ) 表示 S S 中第 k k 大的,它依然可以使用 min min 来表达,至于容斥系数,考虑使用待定系数法来解,假设当前的元素是第 p p 大的,那么我们要解的是
[ p = k ] = p ∑ i = 1 λ ( i ) ( p − 1 i − 1 ) = p − 1 ∑ i = 0 α ( i ) ( p − 1 i ) α ( i ) = λ ( i + 1 ) [ p = k ] = ∑ i = 1 p λ ( i ) ( p − 1 i − 1 ) = ∑ i = 0 p − 1 α ( i ) ( p − 1 i ) α ( i ) = λ ( i + 1 )
将其二项式反演,可以得到
α ( p − 1 ) = p − 1 ∑ i = 0 ( − 1 ) p − 1 − i ( p − 1 i ) [ i = k − 1 ] = ( − 1 ) p − k ( p − 1 k − 1 ) α ( p − 1 ) = ∑ i = 0 p − 1 ( − 1 ) p − 1 − i ( p − 1 i ) [ i = k − 1 ] = ( − 1 ) p − k ( p − 1 k − 1 )
因此 λ ( i ) = α ( i − 1 ) = ( − 1 ) i − k ( i − 1 k − 1 ) λ ( i ) = α ( i − 1 ) = ( − 1 ) i − k ( i − 1 k − 1 ) ,所以可以得到 k t h m a x k t h m a x 的式子:
kthmax ( S ) = ∑ T ⊂ S , | T | ≥ k ( − 1 ) | T | − k ( | T | − 1 k − 1 ) min ( T ) kthmax ( S ) = ∑ T ⊂ S , | T | ≥ k ( − 1 ) | T | − k ( | T | − 1 k − 1 ) min ( T )
当然,它也是可以用在期望上面的:
E ( max ( S ) ) = ∑ T ⊂ S ( − 1 ) | T | + 1 E ( min ( T ) ) E ( max ( S ) ) = ∑ T ⊂ S ( − 1 ) | T | + 1 E ( min ( T ) )
然后它就可以做题了。
先写到这里
还有的斯特林反演之类的东西......
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现