狄利克雷卷积和 莫比乌斯反演
看了《组合数学》,再听了学长讲的……感觉三官被颠覆……
狄利克雷卷积
如此定义:
( f ∗ g ) ( n ) = ∑ x y = n f ( x ) g ( y ) ( f ∗ g ) ( n ) = ∑ x y = n f ( x ) g ( y )
或者可以写为
( f ∗ g ) ( n ) = ∑ d | n f ( d ) g ( n d ) ( f ∗ g ) ( n ) = ∑ d | n f ( d ) g ( n d )
特殊的函数
单位根 ε ε :满足 f ∗ ε = ε ∗ f = f f ∗ ε = ε ∗ f = f 。
ε ( n ) = { 1 , if n = 1 0 , otherwise ε ( n ) = { 1 , if n = 1 0 , otherwise
幂函数 I d k ( n ) = n k I d k ( n ) = n k 。特殊的,I d 1 ( n ) = n I d 1 ( n ) = n 为恒等函数,I d 0 ( n ) = 1 I d 0 ( n ) = 1 为常函数,简记为 I I 。
除数函数 σ k ( n ) = ∑ d | n d k σ k ( n ) = ∑ d | n d k 。特殊的,σ 1 ( n ) σ 1 ( n ) 为因数和函数,简记为 σ ( n ) σ ( n ) ,σ 0 ( n ) σ 0 ( n ) 为因数个数函数,简记为 τ ( n ) τ ( n ) 。
欧拉函数 φ ( n ) φ ( n ) 。质因数分解 n = p c 1 1 p c 2 2 . . . p c k k n = p 1 c 1 p 2 c 2 . . . p k c k ,则 φ ( n ) = n ∏ k i = 1 p i − 1 p i φ ( n ) = n ∏ i = 1 k p i − 1 p i 。
这些函数都是积性函数,满足 g c d ( i , j ) = 1 ⟹ f ( i j ) = f ( i ) f ( j ) g c d ( i , j ) = 1 ⟹ f ( i j ) = f ( i ) f ( j ) 。
函数之间的关系
可能有不完整的地方……
其中可以通过 I I 转化的,都可以通过 μ μ 转换回去。考虑 I ∗ μ = ε I ∗ μ = ε 的事实,后面会讲。
除数函数和幂函数
根据定义,我们有
( I d k ∗ I ) ( n ) = ∑ d | n I d k ( d ) = ∑ d | n d k = σ k ( n ) ( I d k ∗ I ) ( n ) = ∑ d | n I d k ( d ) = ∑ d | n d k = σ k ( n )
即
I d k ∗ I = σ k I d k ∗ I = σ k
欧拉函数和恒等函数
根据卷积:
( φ ∗ I ) ( n ) = ∑ d | n φ ( d ) ( φ ∗ I ) ( n ) = ∑ d | n φ ( d )
在 n = p k n = p k 时(p p 为质数),有:
∑ d | n φ ( d ) = φ ( 1 ) + k ∑ i = 1 φ ( p i ) = 1 + k ∑ i = 1 p i − p i − 1 = p m = d ∑ d | n φ ( d ) = φ ( 1 ) + ∑ i = 1 k φ ( p i ) = 1 + ∑ i = 1 k p i − p i − 1 = p m = d
所以 ( φ ∗ I ) ( p k ) = p k ( φ ∗ I ) ( p k ) = p k
将 n n 质因数分解为 ∏ p k ∏ p k ,根据积性函数的定义,可知:
( φ ∗ I ) ( n ) = n = I d 1 ( n ) ( φ ∗ I ) ( n ) = n = I d 1 ( n )
莫比乌斯函数和欧拉函数
应该把后面看完了再回来看这个……
莫比乌斯函数定义为:
μ ∗ I = ε μ ∗ I = ε
根据: φ ∗ I = I d 1 φ ∗ I = I d 1 ,两边同时卷上 μ μ
有:
φ ∗ I ∗ μ = I d 1 ∗ μ ⟺ φ = I d 1 ∗ μ φ ∗ I ∗ μ = I d 1 ∗ μ ⟺ φ = I d 1 ∗ μ
狄利克雷卷积的逆元
对于一个函数 f f ,我们可以如下的定义一个函数 g g 。
首先设 g ( 1 ) = 1 f ( 1 ) g ( 1 ) = 1 f ( 1 ) 。
然后令 g ( x ) = − 1 f ( 1 ) ∑ d | x , d > 1 g ( d ) f ( x d ) g ( x ) = − 1 f ( 1 ) ∑ d | x , d > 1 g ( d ) f ( x d )
于是 ( f ∗ g ) = ε ( f ∗ g ) = ε
展开带入证明即可。
莫比乌斯函数与莫比乌斯反演
终于到这里了 QwQ
我们定义莫比乌斯函数是 I I 的逆函数,也就是说 ( μ ∗ I ) = ε ( μ ∗ I ) = ε 。
所以,在狄利克雷卷积 中:
μ ( n ) = ⎧ ⎨ ⎩ 1 i f n = 1 0 i f ∃ x ∃ k , n = k x 2 ( − 1 ) m n = p 1 p 2 . . . p m μ ( n ) = { 1 i f n = 1 0 i f ∃ x ∃ k , n = k x 2 ( − 1 ) m n = p 1 p 2 . . . p m
至于为什么强调狄利克雷卷积……后文会提及。
莫比乌斯函数常用于以下形式
g ( n ) = ∑ d | n f ( d ) ⟺ f ( n ) = ∑ d | n μ ( d ) g ( n d ) g ( n ) = ∑ d | n f ( d ) ⟺ f ( n ) = ∑ d | n μ ( d ) g ( n d )
或者可以写作:
f ∗ I = g ⟺ f = g ∗ μ f ∗ I = g ⟺ f = g ∗ μ
而这就是莫比乌斯反演 的核心公式。
很简单的公式,根本无需记忆……
后来知道上式是莫比乌斯反演的因数形式 ,我们实际上还有倍数形式 :
g ( n ) = ∑ n | d f ( d ) ⟺ f ( n ) = ∑ n | d g ( n ) μ ( d n ) g ( n ) = ∑ n | d f ( d ) ⟺ f ( n ) = ∑ n | d g ( n ) μ ( d n )
可能在某些神秘的情况下有用。
求法
和欧拉函数 φ φ 类似,可以通过线性筛 的方法在 O ( n ) O ( n ) 内求出。
vector< int > prms;
int mob[ N] , notp[ N] ;
void getMob ( int n) {
mob[ 1 ] = 1 ;
for ( int i = 2 ; i <= n; ++ i) {
if ( ! notp[ i] )
mob[ i] = - 1 , prms. push_back ( i) ;
for ( int p : prms) {
int ip = i * p;
if ( ip > n) break ;
notp[ ip] = 1 ;
if ( i % p == 0 ) {
mob[ ip] = 0 ;
break ;
} else mob[ ip] = - mob[ i] ;
}
}
}
数论分块(整除分块)
这部分虽然不属于莫比乌斯反演,但是在求很多相关问题的时候需要用到。
开篇膜拜 Pecco 大佬:# 算法学习笔记(36): 莫比乌斯反演
核心问题:求解 ∑ n i = 1 ⌊ n i ⌋ , n ≤ 10 12 ∑ i = 1 n ⌊ n i ⌋ , n ≤ 10 12 。
不难得知, ⌊ n i ⌋ ⌊ n i ⌋ 不同的取值只有 O ( √ n ) O ( n ) 个,并且是连续 的。所以考虑对于每一种取值,求出有其总贡献。问题转化为,对于 i i ,需要求出满足 ⌊ n i ⌋ = ⌊ n j ⌋ ⌊ n i ⌋ = ⌊ n j ⌋ 的最大的 j j 。
于是设 ⌊ n i ⌋ = k ⌊ n i ⌋ = k
⌊ n j ⌋ = k ⟹ k ≤ n j ≤ k + 1 ⟹ 1 k + 1 < j n ≤ 1 k ⟹ j ≤ n k ⟹ j ≤ ⌊ n ⌊ n i ⌋ ⌋ ⌊ n j ⌋ = k ⟹ k ≤ n j ≤ k + 1 ⟹ 1 k + 1 < j n ≤ 1 k ⟹ j ≤ n k ⟹ j ≤ ⌊ n ⌊ n i ⌋ ⌋
也就是说,对于每一个取值 ⌊ n i ⌋ ⌊ n i ⌋ ,最大在 ⌊ n ⌊ n i ⌋ ⌋ ⌊ n ⌊ n i ⌋ ⌋ 时满足。
于是可以这样写出代码:
for ( int l = 1 , r; l <= n; l = r + 1 ) {
r = n / ( n / l) ;
ans += ( r - l + 1 ) * ( n / l) ;
}
练习题:[CQOI2007]余数求和 - 洛谷
补充 :现在我们考虑更极端的情况,例如求:
f ( n ) = n ∑ i = 1 g ( ⌊ n i ⌋ ) f ( n ) = ∑ i = 1 n g ( ⌊ n i ⌋ )
其中:
g ( n ) = n ∑ i = 1 ⌊ n i ⌋ g ( n ) = ∑ i = 1 n ⌊ n i ⌋
写出来 n = 1 e 9 n = 1 e 9 的时候可以轻松过掉。其复杂度为 O ( n 3 4 ) O ( n 3 4 ) ,证明见讨论。
膜拜 @jijidawang in 讨论 。
所以见到类似的数论分块套数论分块,大胆的写下去吧!
其实数论分块不仅仅可以解决 ⌊ n i ⌋ ⌊ n i ⌋ 的问题,也可以套用在 √ i i 的问题上。写法十分类似。这里就不做过多讲解。
莫比乌斯反演的经典结构
莫比乌斯反演的经典套路其实就是 ε , φ , μ , I , I d ε , φ , μ , I , I d 的灵活应用和转换,以及交换合式的小技巧。
其中有 ε ( x ) = [ x = 1 ] = ∑ d | x μ ( d ) , I d ( x ) = x = ∑ d | x φ ( x ) ε ( x ) = [ x = 1 ] = ∑ d | x μ ( d ) , I d ( x ) = x = ∑ d | x φ ( x ) 。
结构1
[ gcd ( i , j ) = 1 ] = ε ( gcd ( i , j ) ) = ∑ d | gcd ( i , j ) μ ( d ) [ gcd ( i , j ) = 1 ] = ε ( gcd ( i , j ) ) = ∑ d | gcd ( i , j ) μ ( d )
于是对于:
n ∑ i = 1 m ∑ j = 1 [ gcd ( i , j ) = 1 ] = n ∑ i = 1 m ∑ j = 1 ∑ d | gcd ( i , j ) μ ( d ) ∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) = 1 ] = ∑ i = 1 n ∑ j = 1 m ∑ d | gcd ( i , j ) μ ( d )
在这里,有一个非常经典的处理方法:提取公因数
也就是枚举 g c d ( i , j ) g c d ( i , j )
= min ( n , m ) ∑ d = 1 ⌊ n i ⌋ ∑ i = 1 ⌊ n j ⌋ ∑ j = 1 μ ( d ) = min ( n , m ) ∑ d = 1 ⌊ n d ⌋ ⌊ m d ⌋ μ ( d ) = ∑ d = 1 min ( n , m ) ∑ i = 1 ⌊ n i ⌋ ∑ j = 1 ⌊ n j ⌋ μ ( d ) = ∑ d = 1 min ( n , m ) ⌊ n d ⌋ ⌊ m d ⌋ μ ( d )
于是最终利用数论分块 求即可。复杂度为 O ( n + √ min ( n , m ) ) O ( n + min ( n , m ) ) 。
但是代码需要注意,每一次取小步跳:
r = min ( n / ( n / l) , m / ( m / l) ) ;
结构2
原题:GCD SUM - 洛谷
gcd ( i , j ) = I d 1 ( gcd ( i , j ) ) = ( I ∗ φ ) ( gcd ( i , j ) ) = ∑ d | gcd ( i , j ) φ ( d ) gcd ( i , j ) = I d 1 ( gcd ( i , j ) ) = ( I ∗ φ ) ( gcd ( i , j ) ) = ∑ d | gcd ( i , j ) φ ( d )
于是求 ∑ n i = 1 ∑ m j = 1 gcd ( i , j ) ∑ i = 1 n ∑ j = 1 m gcd ( i , j ) 的方法与结构1类似即可。
有另外一道题可以用到这个方法:1900D - Small GCD ,具体见题解 # CF1900D - Small GCD 题解
结构3
τ ( x ) = ∑ k | x 1 τ ( x y ) = ∑ i | x ∑ j | y [ gcd ( i , j ) = 1 ] τ ( x ) = ∑ k | x 1 τ ( x y ) = ∑ i | x ∑ j | y [ gcd ( i , j ) = 1 ]
于是求 ∑ n x = 1 ∑ m y = 1 τ ( x y ) ∑ x = 1 n ∑ y = 1 m τ ( x y ) 也就很简单了。
结构4
原题:YY的GCD - 洛谷
令 P P 表示质数集合,求:
n ∑ i = 1 m ∑ j = 1 [ g c d ( i , j ) ∈ P ] ∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) ∈ P ]
我们首先提取公因数:
= ∑ p ∈ P ⌊ n p ⌋ ∑ i = 1 ⌊ m p ⌋ ∑ j = 1 [ g c d ( i , j ) = 1 ] = ∑ p ∈ P ∑ i = 1 ⌊ n p ⌋ ∑ j = 1 ⌊ m p ⌋ [ g c d ( i , j ) = 1 ]
于是根据模型1:
= ∑ p ∈ P ⌊ min ( n , m ) p ⌋ ∑ x = 1 μ ( x ) ⌊ n p x ⌋ ⌊ n p x ⌋ = ∑ p ∈ P ∑ x = 1 ⌊ min ( n , m ) p ⌋ μ ( x ) ⌊ n p x ⌋ ⌊ n p x ⌋
接下来是一个非常经典的套路:枚举 T = p x T = p x
= min ( n , m ) ∑ T = 1 ⌊ n T ⌋ ⌊ m T ⌋ ∑ p | T , p ∈ P μ ( T p ) = ∑ T = 1 min ( n , m ) ⌊ n T ⌋ ⌊ m T ⌋ ∑ p | T , p ∈ P μ ( T p )
于是问题转化为求 ∑ p | T , p ∈ P μ ( T p ) ∑ p | T , p ∈ P μ ( T p ) 的前缀和,这样就可以单次询问 O ( √ n ) O ( n ) 。
这完全可以通过埃氏筛筛出,复杂度 O ( n log log n ) O ( n log log n ) ,十分优秀。
不过也可以通过线性筛筛出(因为这个函数非积性函数,所以这里不展开)。
类似的题还有 [国家集训队]Crash的数字表格 / JZPTAB - 洛谷
问题:∑ n i = 1 ∑ m j = 1 l c m ( i , j ) ∑ i = 1 n ∑ j = 1 m l c m ( i , j ) 。
考虑转化为 gcd gcd ,有
l c m ( i , j ) = i j gcd ( i , j ) = gcd ( i , j ) × i gcd ( i , j ) × j gcd ( i , j ) l c m ( i , j ) = i j gcd ( i , j ) = gcd ( i , j ) × i gcd ( i , j ) × j gcd ( i , j )
带入原式中,枚举 gcd ( i , j ) gcd ( i , j ) ,有:
= min ( n , m ) ∑ d = 1 d n d ∑ i = 1 m d ∑ j = 1 i j [ gcd ( i , j ) = 1 ] = min ( n , m ) ∑ d = 1 d n d ∑ i = 1 m d ∑ j = 1 i j ∑ t | g c d ( i , j ) μ ( t ) = min ( n , m ) ∑ d = 1 d min ( n , m ) d ∑ t = 1 μ ( t ) t 2 n d t ∑ i = 1 i m d t ∑ j = 1 j = ∑ d = 1 min ( n , m ) d ∑ i = 1 n d ∑ j = 1 m d i j [ gcd ( i , j ) = 1 ] = ∑ d = 1 min ( n , m ) d ∑ i = 1 n d ∑ j = 1 m d i j ∑ t | g c d ( i , j ) μ ( t ) = ∑ d = 1 min ( n , m ) d ∑ t = 1 min ( n , m ) d μ ( t ) t 2 ∑ i = 1 n d t i ∑ j = 1 m d t j
后面部分可以通过 g ( n ) = n ( n + 1 ) 2 g ( n ) = n ( n + 1 ) 2 简化。
= min ( n , m ) ∑ d = 1 d min ( n , m ) d ∑ t = 1 μ ( t ) t 2 g ( ⌊ n d t ⌋ ) g ( ⌊ m d t ⌋ ) = ∑ d = 1 min ( n , m ) d ∑ t = 1 min ( n , m ) d μ ( t ) t 2 g ( ⌊ n d t ⌋ ) g ( ⌊ m d t ⌋ )
于是只需要预处理 μ ( t ) t 2 μ ( t ) t 2 的前缀和即可。
但是显然数论分块套数论分块不够优秀,考虑继续优化。
所以枚举 T = d t T = d t 。
= min ( n , m ) ∑ T = 1 g ( ⌊ n T ⌋ ) g ( ⌊ m T ⌋ ) T ∑ t | T μ ( t ) t = ∑ T = 1 min ( n , m ) g ( ⌊ n T ⌋ ) g ( ⌊ m T ⌋ ) T ∑ t | T μ ( t ) t
也就是说只需要线性求出 ∑ t | T μ ( t ) t ∑ t | T μ ( t ) t 即可(其满足积性)。
有 [SDOI2014]数表 - 洛谷
问题:∑ n i = 1 ∑ m j = 1 σ ( gcd ( i , j ) ) ∑ i = 1 n ∑ j = 1 m σ ( gcd ( i , j ) )
不过这道题要难一些,因为涉及到了更多的操作。
主要就是将询问离线,按照限制的大小一一处理即可。
有 毒瘤之神的考验 - 洛谷
求 ∑ n i = 1 ∑ m j = 1 φ ( i j ) ∑ i = 1 n ∑ j = 1 m φ ( i j ) 。
需要知道转化式子:
φ ( i j ) = φ ( i ) φ ( j ) gcd ( i , j ) φ ( gcd ( i , j ) ) φ ( i j ) = φ ( i ) φ ( j ) gcd ( i , j ) φ ( gcd ( i , j ) )
将 φ φ 展开即可证明。
于是可以得到玄妙的式子。
然后通过值域分治求解即可。
……说着简单
化简后有三个函数:
f ( n ) = ∑ d | n d μ ( n d ) φ ( d ) g ( n , t ) = n ∑ i = 1 φ ( i t ) h ( n , m , t ) = f ( t ) ∗ g ( n , t ) ∗ g ( m , t ) f ( n ) = ∑ d | n d μ ( n d ) φ ( d ) g ( n , t ) = ∑ i = 1 n φ ( i t ) h ( n , m , t ) = f ( t ) ∗ g ( n , t ) ∗ g ( m , t )
原式为:
min ( n , m ) ∑ t = 1 h ( ⌊ n t ⌋ , ⌊ m t ⌋ , t ) ∑ t = 1 min ( n , m ) h ( ⌊ n t ⌋ , ⌊ m t ⌋ , t )
显然,由于 h h 的状态数很恨很多,所以考虑值域分治。
在 n t n t 比较大的时候暴力求解,到很小的时候再利用预处理的前缀和快速求解。
类似于 √ n n 分治吧。
于是你可以写出类下的代码:
lint solve ( lint n, lint m) {
if ( n > m) swap ( n, m) ;
lint ans = 0 ;
for ( lint i = 1 ; i <= min ( n, S) ; ++ i)
( ans += h ( i, n / i, m / i) ) %= mod;
for ( lint l = S + 1 , r; l <= n; l = r + 1 ) {
r = min ( n / ( n / l) , m / ( m / l) ) ;
ans += t[ n / l] [ m / l] [ r] - t[ n / l] [ m / l] [ l - 1 ] + mod;
ans %= mod;
}
return ans;
}
其中 S S 表示分治的边界,t t 表示对于 h h 在第三个参数位置的前缀和。
预处理也是很简单:
inline lint h ( int t, int n, int m) {
return f[ t] * g[ t] [ n] % mod * g[ t] [ m] % mod;
}
void init ( lint n = 1e5 ) {
for ( lint i = 1 ; i <= n; ++ i) {
for ( lint j = 1 ; i * j <= n; ++ j)
( f[ i * j] += ( mod + mob[ j] ) % mod * i % mod * iphi[ i] % mod) %= mod;
}
for ( lint t = 1 ; t <= n; ++ t) {
g[ t] . resize ( n / t + 1 ) ;
for ( int i = 1 ; i * t <= n; ++ i)
g[ t] [ i] = ( g[ t] [ i - 1 ] + phi[ i * t] ) % mod;
}
for ( int i = 1 ; i < B; ++ i) for ( int j = 1 ; j < B; ++ j) {
int len = n / max ( i, j) ;
t[ i] [ j] . resize ( len + 2 ) ;
t[ i] [ j] [ 0 ] = 0 ;
for ( int k = 1 ; k <= len; ++ k)
t[ i] [ j] [ k] = ( t[ i] [ j] [ k - 1 ] + f[ k] * g[ k] [ i] % mod * g[ k] [ j] % mod) % mod;
}
S = N / B;
}
很烦写而已。
结构总结
在这类莫比乌斯反演中,经典的两个套路:
其实在 Pecco 的文章中,对于提取公因数这个方法有更加深刻的阐释。其不仅能应用在只有 i , j i , j 两个变量的模型中,还可以扩展到更多的变量上。
再次膜拜大佬:# 算法学习笔记(36): 莫比乌斯反演
其实一般讲莫比乌斯反演到这里就没有了,但是我看了《组合数学》中的莫比乌斯反演一章。我发现两者根本不在同一个位阶上……这就是颠覆我认知的原因。
所以这里我还要把莫比乌斯反演扩展出来。
莫比乌斯再认识
我们考虑这么一个情况:
有集合 X X 和偏序关系 ( P ( X ) , ⊆ ) ( P ( X ) , ⊆ ) ,设:
F : P ( X ) → R G : P ( X ) → R F : P ( X ) → R G : P ( X ) → R
其中:G ( S ) = ∑ T ⊆ S F ( T ) G ( S ) = ∑ T ⊆ S F ( T ) 。
则可以求得:F ( S ) = ∑ T ⊆ S ( − 1 ) | S | − | T | G ( T ) F ( S ) = ∑ T ⊆ S ( − 1 ) | S | − | T | G ( T )
由 G G 求的 F F 的过程称为反解,其中,( − 1 ) | S | − | T | ( − 1 ) | S | − | T | 就是莫比乌斯函数在这种情况下的取值,也称为容斥系数。
顺便回顾一下基本容斥原理:
设 A 1 , A 2 , ⋯ , A n A 1 , A 2 , ⋯ , A n 是有限集 S S 的子集(代表 n n 中属性?)定义 F ( K ) F ( K ) (K K 为下标集合,⊆ { 1 , 2 , ⋯ , n } ⊆ { 1 , 2 , ⋯ , n } )为集合 S S 中 ∈ A i ( i ∉ K ) ∈ A i ( i ∉ K ) 的元素的个数。也就是对于 s ∈ S s ∈ S ,计数 s s 当且仅当:
∀ i ∈ K , s ∉ A i ∀ j ∉ K , s ∈ A j ∀ i ∈ K , s ∉ A i ∀ j ∉ K , s ∈ A j
于是设 G ( K ) = ∑ L ⊆ K F ( L ) G ( K ) = ∑ L ⊆ K F ( L ) ,
其计数 S S 中属于 j j 不在 K K 中的所有 A j A j 的元素,以及属于其他的一些集合的元素的个数。因而还有:
G ( K ) = | ⋂ i ∉ K A i | G ( K ) = | ⋂ i ∉ K A i |
根据上文,有
F ( K ) = ∑ L ⊆ K ( − 1 ) | K | − | L | G ( L ) (1) (1) F ( K ) = ∑ L ⊆ K ( − 1 ) | K | − | L | G ( L )
此时 F ( X n ) ( X n = { 1 , 2 , ⋯ , n } ) F ( X n ) ( X n = { 1 , 2 , ⋯ , n } ) 计数的是那些仅属于满足 i ∉ X n i ∉ X n 的集合 A i A i 的元素,因此:
F ( X n ) = | ⋂ i ∈ X n ¯ ¯¯¯¯ ¯ A i | F ( X n ) = | ⋂ i ∈ X n A i ¯ |
带入 ( 1 ) ( 1 ) 中可以得到:
| ¯ ¯¯¯¯ ¯ A 1 ∩ ¯ ¯¯¯¯ ¯ A 2 ∩ ⋯ ∩ ¯ ¯¯¯¯¯ ¯ A n | = ∑ L ⊆ X n ( − 1 ) n − | L | | ⋂ i ∉ L A i | | A 1 ¯ ∩ A 2 ¯ ∩ ⋯ ∩ A n ¯ | = ∑ L ⊆ X n ( − 1 ) n − | L | | ⋂ i ∉ L A i |
如过等价的利用 L L 的补集,那么我们有:
| ¯ ¯¯¯¯ ¯ A 1 ∩ ¯ ¯¯¯¯ ¯ A 2 ∩ ⋯ ∩ ¯ ¯¯¯¯¯ ¯ A n | = ∑ J ⊆ X n ( − 1 ) J | ⋂ i ∈ J A i | | A 1 ¯ ∩ A 2 ¯ ∩ ⋯ ∩ A n ¯ | = ∑ J ⊆ X n ( − 1 ) J | ⋂ i ∈ J A i |
这就是基本的容斥原理。
二项式反演
为什么突然到这里了……
二项式反演可以说是上面内容的一种特殊形式。其满足:
| S | = | T | ⟹ F ( S ) = F ( T ) , G ( S ) = G ( T ) | S | = | T | ⟹ F ( S ) = F ( T ) , G ( S ) = G ( T )
此时我们可以直接通过集合大小表示:F ( S ) = f ( | S | ) , G ( S ) = g ( | S | ) F ( S ) = f ( | S | ) , G ( S ) = g ( | S | )
于是对于 G ( K ) = ∑ L ⊆ K F ( L ) G ( K ) = ∑ L ⊆ K F ( L ) ,合并相同大小的子集,即可得到:
g ( k ) = k ∑ l = 0 ( k l ) f ( l ) g ( k ) = ∑ l = 0 k ( k l ) f ( l )
根据反演,也就有:
f ( k ) = k ∑ l = 0 ( − 1 ) k − l ( k l ) g ( l ) f ( k ) = ∑ l = 0 k ( − 1 ) k − l ( k l ) g ( l )
这也就是二项式反演在此的推导,这里的莫比乌斯函数 μ μ ,后文再说。
扩展到偏序集
在此,我们扩展到任意有限偏序集 ( X , ≤ ) ( X , ≤ ) 。不过为了得到莫比乌斯函数,我们首先考虑二元变量。
设 F ( X ) F ( X ) 是满足只要 x ≰ y x ≰ y 就有 f ( x , y ) = 0 f ( x , y ) = 0 的所有实数函数的集合。
f : X × X → R f : X × X → R
我们如此定义卷积 h = f ∗ g h = f ∗ g :
h ( x , y ) = { ∑ { z : x ≤ z ≤ y } f ( x , z ) g ( z , y ) ( x ≤ y ) 0 o t h e r w i s e h ( x , y ) = { ∑ { z : x ≤ z ≤ y } f ( x , z ) g ( z , y ) ( x ≤ y ) 0 o t h e r w i s e
不难证明卷积 满足结合律 ,这部分留个读者思考。
于是,我们重新定义如下函数:
δ ( x , y ) = { 1 if x = y 0 otherwise δ ( x , y ) = { 1 if x = y 0 otherwise
ζ ( x , y ) = { 1 if x ≤ y 0 otherwise ζ ( x , y ) = { 1 if x ≤ y 0 otherwise
至于莫比乌斯函数 ,与上文的定义类似,也就是 ζ ζ 的逆函数:
μ ∗ ζ = δ μ ∗ ζ = δ
于是通过卷积的定义,我们得到:
∑ { z : x ≤ z ≤ y } μ ( x , z ) ζ ( z , y ) = δ ( x , y ) ( x ≤ y ) ∑ { z : x ≤ z ≤ y } μ ( x , z ) ζ ( z , y ) = δ ( x , y ) ( x ≤ y )
或等价的:
∑ { z : x ≤ z ≤ y } μ ( x , z ) = δ ( x , y ) ( x ≤ y ) (2.1) (2.1) ∑ { z : x ≤ z ≤ y } μ ( x , z ) = δ ( x , y ) ( x ≤ y )
而等式 ( 2.1 ) ( 2.1 ) 意味着,对于所有的 x x :
μ ( x , x ) = 1 μ ( x , x ) = 1
以及:
μ ( x , y ) = − ∑ { z : x ≤ z < y } μ ( x , z ) ( x < y ) μ ( x , y ) = − ∑ { z : x ≤ z < y } μ ( x , z ) ( x < y )
至于莫比乌斯反演 ,无非还是:
f ∗ ζ = g ⟺ f = g ∗ μ f ∗ ζ = g ⟺ f = g ∗ μ
于是我们重新思考二项式反演,其实就是偏序集 ( P ( X n ) , ⊆ ) ( P ( X n ) , ⊆ ) 上的莫比乌斯反演。
设 A A 和 B B 是 X n X n 的子集,且 A ⊆ B A ⊆ B ,有 μ ( A , B ) = ( − 1 ) | B | − | A | μ ( A , B ) = ( − 1 ) | B | − | A | 。
这可以通过归纳假设证明,这里不过多展开。
开篇讲的狄利克雷 卷积上的莫比乌斯反演,其实就是偏序集 ( Z , | ) ( Z , | ) 上的莫比乌斯反演。
这东西谁都知道,一元的莫比乌斯函数 μ ( x ) μ ( x ) 怎么求。不过我们的目标是计算该偏序集的 μ ( a , b ) μ ( a , b ) 。
但是,由于如果 a | b a | b 则 μ ( a , b ) = μ ( 1 , b a ) μ ( a , b ) = μ ( 1 , b a ) 。所以我们只需要算 μ ( 1 , x ) μ ( 1 , x ) 即可。
而 μ ( x ) μ ( x ) 其实就是 μ ( 1 , x ) μ ( 1 , x ) ……
考虑离散傅立叶变换。
越扯越远了……QwQ
不了解离散傅立叶变换的可以参考:算法学习笔记(17): 快速傅里叶变换(FFT)
我们有:
h ( ω x ) = n − 1 ∑ k = 0 c k ω k x h ( ω x ) = ∑ k = 0 n − 1 c k ω k x
我们整理一下重新写出:
g ( x ) = n − 1 ∑ k = 0 ω k x f ( k ) g ( x ) = ∑ k = 0 n − 1 ω k x f ( k )
根据离散傅立叶逆变换,则有:
f ( x ) = 1 n n − 1 ∑ k = 0 ω − k x g ( k ) f ( x ) = 1 n ∑ k = 0 n − 1 ω − k x g ( k )
其中,1 n ω − k x 1 n ω − k x 就是容斥系数,μ ( k , x ) μ ( k , x ) 。
最后的最后,提一个题吧:[春季测试 2023] 幂次 - 洛谷 。
其实也可以通过容斥(求 μ μ )求解,但并非反演。
参见博客:幂次 - Jijidawang
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?