莫比乌斯反演主要用于快速计算一些阴间式子(包含 gcd ( i , j ) \gcd(i,j) gcd(i,j) 等)。
至于如何应用,往下看。
μ ( x ) = { 1 x = 1 0 n 含有平方因子 ( − 1 ) k k 为 n 本质不同质因子个数 \mu(x)=\begin{cases}1&x=1\\ 0&n 含有平方因子\\ (-1)^k & k 为 n 本质不同质因子个数 \end{cases} μ(x)=⎩ ⎨ ⎧10(−1)kx=1n含有平方因子k为n本质不同质因子个数
假设 x = ∏ i = 1 k p i c i x = \prod\limits_{i=1}^{k}p_i^{c_i} x=i=1∏kpici,其中 p i p_i pi 为质数, c i ≥ 1 c_i \geq 1 ci≥1。( 20 = 2 2 × 5 20 = 2^2 \times 5 20=22×5)
若 x = 1 x= 1 x=1,则 μ ( x ) = 1 \mu(x) = 1 μ(x)=1。
若存在 c i > 1 c_i >1 ci>1,则 μ ( x ) = 0 \mu(x) = 0 μ(x)=0。
若 c i ≤ 1 c_i \leq 1 ci≤1,则 μ ( x ) = ( − 1 ) k \mu(x) = (-1)^k μ(x)=(−1)k。
由于莫比乌斯函数可以 O ( n ) O(n) O(n) 线性筛预处理,所以我们大可以将题目中的式子转化成包含莫比乌斯函数的式子。以此来减少计算时间复杂度。
μ ∗ 1 = ϵ \mu * 1=\epsilon μ∗1=ϵ,即
∑ d ∣ n μ ( d ) = [ n = 1 ] \sum_{d|n}\mu(d)=[n=1] d∣n∑μ(d)=[n=1]
补充:狄利克雷卷积
函数 f ( x ) f(x) f(x), g ( x ) g(x) g(x) 的狄利克雷卷积 ( f ∗ g ) ( x ) = ∑ d ∣ x f ( x ) g ( x d ) (f * g)(x) = \sum\limits_{d|x}f(x)g(\frac{x}{d}) (f∗g)(x)=d∣x∑f(x)g(dx)
可以看成: ( f ∗ g ) ( x ) = ∑ i ∑ j f ( i ) g ( j ) [ i j = x ] (f * g)(x) = \sum\limits_{i}\sum\limits_{j}f(i)g(j)[ij=x] (f∗g)(x)=i∑j∑f(i)g(j)[ij=x]
补充:狄利克雷卷积单位元 ϵ \epsilon ϵ
ϵ ( x ) = [ x = 1 ] \epsilon(x)=[x=1] ϵ(x)=[x=1]
性质:对于任意一个函数 f f f,有 f ∗ ϵ = f f*\epsilon=f f∗ϵ=f。
μ ∗ d = 1 \mu * \operatorname{d} =1 μ∗d=1,即
∑ i ∣ n μ ( i ) d ( n i ) = 1 \sum_{i|n}\mu(i)\operatorname{d}(\frac{n}{i}) = 1 i∣n∑μ(i)d(in)=1
补充:约数个数函数 d ( x ) \operatorname{d}(x) d(x)
d ( n ) = n 的约数个数 = ∑ d = 1 n [ d ∣ n ] \operatorname{d}(n)=n的约数个数=\sum_{d=1}^{n}[d|n] d(n)=n的约数个数=d=1∑n[d∣n]
套路
接下来我会讲一些结论以及其证明,通过这些结论和证明过程(还有你的思维技巧),可以解决一些莫反问题。
∑ i = 1 n ∑ j ∣ i f ( j ) = ∑ i f ( i ) ⌊ n i ⌋ \sum_{i=1}^{n}\sum_{j|i}f(j) = \sum_{i}f(i)\left\lfloor\frac{n}{i}\right\rfloor i=1∑nj∣i∑f(j)=i∑f(i)⌊in⌋
此结论可以在和式后面的式子 f f f 与 i i i 无关,但其有关的变量 j j j 为 i i i 的因数时使用。
最后可以通过整除分块或者其他方法快速处理 ⌊ n i ⌋ \left\lfloor\frac{n}{i}\right\rfloor ⌊in⌋。
∑ i = 1 n ∑ j ∣ i f ( j ) \sum_{i=1}^{n}\sum_{j|i}f(j) i=1∑nj∣i∑f(j)
将 j ∣ i j|i j∣i 提出:
= ∑ i = 1 n ∑ j f ( j ) [ j ∣ i ] =\sum_{i=1}^{n}\sum_{j}f(j)[j|i] =i=1∑nj∑f(j)[j∣i]
换位:
= ∑ j ∑ i = 1 n f ( j ) [ j ∣ i ] =\sum_{j}\sum_{i=1}^{n}f(j)[j|i] =j∑i=1∑nf(j)[j∣i]
将 j ∣ i j|i j∣i 塞回:
= ∑ j ∑ i = 1 , j ∣ i n f ( j ) =\sum_{j}\sum_{i=1,j|i}^{n}f(j) =j∑i=1,j∣i∑nf(j)
让 i = j i ′ i = ji' i=ji′,可以消去 j ∣ i j|i j∣i 条件:
= ∑ j ∑ i ′ = 1 , j i ′ ≤ n f ( j ) =\sum_{j}\sum_{i'=1,ji'\leq n}f(j) =j∑i′=1,ji′≤n∑f(j)
由于 ( ∀ j i ′ ≤ n ) ( i ′ ≤ ⌊ n j ⌋ ) (\forall ji'\leq n)(i'\leq\left\lfloor\frac{n}{j}\right\rfloor) (∀ji′≤n)(i′≤⌊jn⌋):
= ∑ j ∑ i ′ = 1 ⌊ n j ⌋ f ( j ) =\sum_{j}\sum_{i'=1}^{\left\lfloor\frac{n}{j}\right\rfloor}f(j) =j∑i′=1∑⌊jn⌋f(j)
f ( j ) f(j) f(j) 与 i i i 无关,所以:
= ∑ j f ( j ) ⌊ n j ⌋ =\sum_{j}f(j)\left\lfloor\frac{n}{j}\right\rfloor =j∑f(j)⌊jn⌋
换变量名:
= ∑ i f ( i ) ⌊ n i ⌋ =\sum_{i}f(i)\left\lfloor\frac{n}{i}\right\rfloor =i∑f(i)⌊in⌋
∑ i = 1 n ∑ j = 1 ⌊ n i ⌋ f ( i , j ) = ∑ i = 1 n ∑ j ∣ i f ( j , i j ) \sum_{i=1}^{n}\sum_{j=1}^{\left\lfloor\frac{n}{i}\right\rfloor}f(i,j)=\sum_{i=1}^{n}\sum_{j|i}f(j,\frac{i}{j}) i=1∑nj=1∑⌊in⌋f(i,j)=i=1∑nj∣i∑f(j,ji)
此结论可以转换求和公式,从而尝试化简。
读者自证不难。
∑ i = 1 n ∑ j = 1 ⌊ n i ⌋ f ( i , j ) \sum_{i=1}^{n}\sum_{j=1}^{\left\lfloor\frac{n}{i}\right\rfloor}f(i,j) i=1∑nj=1∑⌊in⌋f(i,j)
我们令 T = i j T = ij T=ij,则有:
= ∑ i = 1 n ∑ T = i , i ∣ T n f ( i , T i ) =\sum_{i=1}^{n}\sum_{T=i, i|T}^{n}f(i,\frac{T}{i}) =i=1∑nT=i,i∣T∑nf(i,iT)
由于 ( ∀ T < i ) ( i ∤ T ) (\forall T(∀T<i)(i∣ T),有:
= ∑ i = 1 n ∑ T = 1 , i ∣ T n f ( i , T i ) =\sum_{i=1}^{n}\sum_{T=1, i|T}^{n}f(i,\frac{T}{i}) =i=1∑nT=1,i∣T∑nf(i,iT)
将 i ∣ T i|T i∣T 提出:
= ∑ i = 1 n ∑ T = 1 n f ( i , T i ) [ i ∣ T ] =\sum_{i=1}^{n}\sum_{T=1}^{n}f(i,\frac{T}{i})[i|T] =i=1∑nT=1∑nf(i,iT)[i∣T]
交换两个 Σ \Sigma Σ:
= ∑ T = 1 n ∑ i = 1 n f ( i , T i ) [ i ∣ T ] =\sum_{T=1}^{n}\sum_{i=1}^{n}f(i,\frac{T}{i})[i|T] =T=1∑ni=1∑nf(i,iT)[i∣T]
将 i ∣ T i|T i∣T 再放入 i i i 的 Σ \Sigma Σ 中提出:
= ∑ T = 1 n ∑ i = 1 , i ∣ T n f ( i , T i ) =\sum_{T=1}^{n}\sum_{i=1,i|T}^{n}f(i,\frac{T}{i}) =T=1∑ni=1,i∣T∑nf(i,iT)
由于 ( ∀ i > T ) ( i ∤ T ) (\forall i> T)(i\not|~T) (∀i>T)(i∣ T),我们可以将 i = 1... n i=1...n i=1...n 的限制去掉:
= ∑ T = 1 n ∑ i ∣ T f ( i , T i ) =\sum_{T=1}^{n}\sum_{i|T}f(i,\frac{T}{i}) =T=1∑ni∣T∑f(i,iT)
再换个变量名:
= ∑ i = 1 n ∑ j ∣ i f ( j , i j ) =\sum_{i=1}^{n}\sum_{j|i}f(j,\frac{i}{j}) =i=1∑nj∣i∑f(j,ji)
∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) = 1 ] = ∑ d μ ( d ) ⌊ n d ⌋ ⌊ m d ⌋ \sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j) =1] = \sum_{d}\mu(d)\left\lfloor\frac{n}{d}\right\rfloor\left\lfloor\frac{m}{d}\right\rfloor i=1∑nj=1∑m[gcd(i,j)=1]=d∑μ(d)⌊dn⌋⌊dm⌋
终于遇到 μ \mu μ 了(
经典结论,用来化简 gcd \gcd gcd 函数,其实其核心思想是 [ d ∣ gcd ( i , j ) ] = [ d ∣ i ] [ d ∣ j ] [d|\gcd(i,j)]=[d|i][d|j] [d∣gcd(i,j)]=[d∣i][d∣j]。
∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) = 1 ] \sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j) =1] i=1∑nj=1∑m[gcd(i,j)=1]
莫比乌斯函数性质可转化为( ∑ d ∣ n μ ( d ) = [ n = 1 ] \sum\limits_{d|n}\mu(d)=[n=1] d∣n∑μ(d)=[n=1]):
= ∑ i = 1 n ∑ j = 1 m ∑ d ∣ gcd ( i , j ) μ ( d ) =\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{d|\gcd(i,j)}\mu(d) =i=1∑nj=1∑md∣gcd(i,j)∑μ(d)
由于 d ∣ g c d ( i , j ) ⇒ ( d ∣ i and d ∣ j ) d|gcd(i,j) \Rarr (d|i \operatorname{and} d|j) d∣gcd(i,j)⇒(d∣iandd∣j) 可知:
= ∑ i = 1 n ∑ j = 1 m ∑ d ∣ i , d ∣ j μ ( d ) =\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{d|i,d|j}\mu(d) =i=1∑nj=1∑md∣i,d∣j∑μ(d)
根据结论 #2,有:
= ∑ d μ ( d ) ⌊ n d ⌋ ⌊ m d ⌋ =\sum_{d}\mu(d)\left\lfloor\frac{n}{d}\right\rfloor\left\lfloor\frac{m}{d}\right\rfloor =d∑μ(d)⌊dn⌋⌊dm⌋
也可以等于
= ∑ d = 1 n μ ( d ) ⌊ n d ⌋ ⌊ m d ⌋ =\sum_{d=1}^{n}\mu(d)\left\lfloor\frac{n}{d}\right\rfloor\left\lfloor\frac{m}{d}\right\rfloor =d=1∑nμ(d)⌊dn⌋⌊dm⌋
f ( x ) = ∑ i i [ f ( x ) = i ] f(x)=\sum_{i}i[f(x)=i] f(x)=i∑i[f(x)=i]
使用此结论可以把一些函数的求和转换为判断,例如: gcd ( i , j ) \gcd(i,j) gcd(i,j)(这是最常见的操作)。
留作习题
那么由于 i i i 可以取任何值,而且任何值只会取一次。所以只有一个 i i i 满足 i = f ( x ) i=f(x) i=f(x)。
所以 f ( x ) = ∑ i i [ f ( x ) = i ] f(x)=\sum\limits_{i}i[f(x)=i] f(x)=i∑i[f(x)=i]
f ( x ) = ∏ i i [ f ( x ) = i ] f(x)=\prod_{i}i^{[f(x)=i]} f(x)=i∏i[f(x)=i]
使用此结论可以把一些函数的连乘转换为判断,例如: gcd ( i , j ) \gcd(i,j) gcd(i,j)。也是常见套路。
更好的是这种转换可以将函数丢到指数位置上,从而把 Π \Pi Π 变成 Σ \Sigma Σ。
例如:
∏ i n ∏ j m gcd ( i , j ) = ∏ d ∏ i n ∏ j m d [ gcd ( i , j ) = d ] = ∏ d d ∑ i n ∑ j m [ gcd ( i , j ) = d ] \prod_{i}^{n}\prod_{j}^{m}\gcd(i,j)=\prod_{d}\prod_{i}^{n}\prod_{j}^{m}d^{[\gcd(i,j)=d]} = \prod_{d}d^{\sum\limits_{i}^{n}\sum\limits_{j}^{m}[\gcd(i,j)=d]} i∏nj∏mgcd(i,j)=d∏i∏nj∏md[gcd(i,j)=d]=d∏di∑nj∑m[gcd(i,j)=d]
留作习题
那么由于 i i i 可以取任何值,而且任何值只会取一次。所以只有一个 i i i 满足 i = f ( x ) i=f(x) i=f(x)。
所以 f ( x ) = ∏ i i [ f ( x ) = i ] f(x)=\prod\limits_{i}i^{[f(x)=i]} f(x)=i∏i[f(x)=i]
d ( n m ) = ∑ i ∣ n ∑ j ∣ m [ g c d ( i , j ) = 1 ] \operatorname{d}(nm) = \sum_{i|n}\sum_{j|m}[gcd(i,j)=1] d(nm)=i∣n∑j∣m∑[gcd(i,j)=1]
未完待续。
当我们通过上面的结论推导出一个式子时,可以通过暴力计算得到答案。
但是显然,一般情况下,这样做时间复杂度较高。虽然已经比暴力算原式快了不少
所以我们可以通过预处理和前缀和或者其他方式(线段树动态维护等)来降低时间复杂度。
可以 O ( n ) O(n) O(n) 时间内筛出大部分积性函数 [ 1 , n ] [1,n] [1,n] 的值。
最常用的,就是筛莫比乌斯函数 μ \mu μ,因为一反演就基本上会用到 μ \mu μ。
μ \mu μ 为积性函数,所以若 g c d ( a , b ) = 1 gcd(a,b) = 1 gcd(a,b)=1,则 μ ( a b ) = μ ( a ) μ ( b ) \mu(ab)=\mu(a)\mu(b) μ(ab)=μ(a)μ(b)。
为了筛 μ \mu μ,我们考虑当 p p p 为质数时, μ ( p ) \mu(p) μ(p) 的取值。显然 μ ( p ) = − 1 \mu(p) = -1 μ(p)=−1。
那么再考虑当 p p p 为质数, p ∣ a p|a p∣a 时, μ ( a p ) \mu(ap) μ(ap) 和 μ ( a ) , μ ( p ) \mu(a),\mu(p) μ(a),μ(p) 的关系。显然由于 a a a 中已经包含质因子 p p p,所以 a p ap ap 的质因子 p p p 的幂一定大于等于 2 2 2。所以 μ ( a p ) = 0 \mu(ap) = 0 μ(ap)=0。
于是可以轻而易举的筛出 μ \mu μ。
未完待续。
了解完如何运用莫比乌斯反演和预处理降低时间复杂度后,我们来做点例题。
未完待续。