莫比乌斯反演学习笔记

为啥学习莫比乌斯反演?是因为最近 CF 连着两次莫反让我感觉到自己没有力量。

大概是复读一下题解的话再加上一点自己的理解。

前置知识和引理:

数论分块:

不想写了,反正都2021年了大家肯定都会了。

二项式定理:

( a + b ) n = ∑ i = 0 n C n i a n − i b i (a+b)^n=\sum\limits_{i=0}^{n} C_{n}^{i}a^{n-i}b^i (a+b)n=i=0nCnianibi

引理 1:

∀ a , b , c ∈ z ⌊ a b c ⌋ = ⌊ ⌊ a b ⌋ c ⌋ \forall{a,b,c \in \mathbb{z}} \quad \lfloor \frac{a}{bc} \rfloor= \lfloor\frac{\lfloor \frac{a}{b} \rfloor}{c}\rfloor a,b,czbca=cba

证明: ⌊ a b c ⌋ = ⌊ a b × 1 c ⌋ \lfloor \frac{a}{bc} \rfloor=\lfloor \frac{a}{b}\times \frac{1}{c} \rfloor bca=ba×c1

⌊ a b ⌋ = a b − d \lfloor \frac{a}{b}\rfloor=\frac{a}{b}-d ba=bad

⌊ a b × 1 c ⌋ = ⌊ ( ⌊ a b ⌋ + d ) × 1 c ⌋ = ⌊ ⌊ a b ⌋ c + d c ⌋ = ⌊ ⌊ a b ⌋ c ⌋ \lfloor \frac{a}{b}\times \frac{1}{c} \rfloor=\lfloor (\lfloor \frac{a}{b}\rfloor+d)\times \frac{1}{c} \rfloor=\lfloor \frac{\lfloor\frac{a}{b}\rfloor}{c} + \frac{d}{c} \rfloor=\lfloor\frac{\lfloor \frac{a}{b} \rfloor}{c}\rfloor ba×c1=(ba+d)×c1=cba+cd=cba

Q . E . D Q.E.D Q.E.D

引理 2:

对于给定的 N ∈ N + N\in \mathbb{N_+} NN+,对于任意的 d ∈ N + d \in \mathbb{N_+} dN+ ⌊ N d ⌋ \lfloor \frac{N}{d} \rfloor dN 最多有 ⌊ 2 N ⌋ \lfloor2\sqrt N\rfloor 2N 种取值。

证明:当 d ≤ N d \le \sqrt N dN 时, ⌊ N d ⌋ \lfloor \frac{N}{d} \rfloor dN 显然最多有 N \sqrt N N 种取值。

d > N d > \sqrt N d>N ,易得最多有 N \sqrt N N 种取值。

Q . E . D Q.E.D Q.E.D

引理 2 其实就是数论分块复杂度的证明。

积性函数

定义

若函数 f ( n ) f(n) f(n) 满足 f ( 1 ) = 1 f(1)=1 f(1)=1 ∀ x , y ∈ N + ( g c d ( x , y ) = 1 ) , f ( x y ) = f ( x ) f ( y ) \forall x,y\in \mathbb{N_+}(gcd(x,y)=1),f(xy)=f(x)f(y) x,yN+(gcd(x,y)=1),f(xy)=f(x)f(y),则称其为积性函数。

e.g:

欧拉函数 ϕ ( x ) = ∑ i = 1 n [ g c d ( i , x ) = 1 ] \phi(x)=\sum\limits_{i=1}^n[gcd(i,x)=1] ϕ(x)=i=1n[gcd(i,x)=1]

除数函数 σ k ( x ) = ∑ d ∣ n d k \sigma_k(x)=\sum\limits_{d|n} d^k σk(x)=dndk。特别的我们记 σ 0 ( x ) = τ ( x ) \sigma_0(x)=\tau(x) σ0(x)=τ(x) 或者 d ( x ) d(x) d(x)

若函数 f ( n ) f(n) f(n) 满足 f ( 1 ) = 1 f(1)=1 f(1)=1 ∀ x , y ∈ N + , f ( x y ) = f ( x ) f ( y ) \forall x,y\in \mathbb{N_+},f(xy)=f(x)f(y) x,yN+,f(xy)=f(x)f(y),则称其为完全积性函数。

备注:其实 f ( 1 ) = 1 f(1)=1 f(1)=1 是一个多余的东西,因为 f ( 1 ) = f ( 1 ) f ( 1 ) f(1)=f(1)f(1) f(1)=f(1)f(1)

e.g:

常数函数 I ( n ) = 1 I(n)=1 I(n)=1

狄利克雷卷积

对于 f ( x ) , g ( x ) f(x),g(x) f(x),g(x) 两个函数(注意不一定是积性函数)它们的狄利克雷卷积写作 f ∗ g f * g fg,这个 f ∗ g f*g fg 就是卷出来的新函数的名称。

( f ∗ g ) ( n ) = ∑ d ∣ n f ( d ) g ( x d ) = ∑ x y = n f ( x ) g ( y ) (f*g)(n)=\sum\limits_{d|n} f(d)g(\frac{x}{d})=\sum\limits_{xy=n}f(x)g(y) (fg)(n)=dnf(d)g(dx)=xy=nf(x)g(y)

那么有

交换律: f ∗ g = g ∗ f f*g=g*f fg=gf

结合律: f ∗ ( g ∗ h ) = ( f ∗ g ) ∗ h f*(g*h)=(f*g)*h f(gh)=(fg)h

然后再介绍一个函数 ϵ ( x ) = [ x = 1 ] \epsilon(x)=[x=1] ϵ(x)=[x=1],这个函数有性质: ϵ ∗ f = f \epsilon*f=f ϵf=f,可以看做卷积中的单位元(所以又叫做元函数)。

积性函数的性质

f 1 ( x ) f1(x) f1(x) f 2 ( x ) f2(x) f2(x) 都是积性函数,那么以下函数也都是积性函数:

h ( x ) = f 1 ( x p ) h(x)=f1(x^p) h(x)=f1(xp)

h ( x ) = f 1 p ( x ) = f 1 p − 1 ∗ f 1 h(x)=f1^p(x)=f1^{p-1}*f1 h(x)=f1p(x)=f1p1f1

h ( x ) = f 1 ( x ) ∗ f 2 ( x ) h(x)=f1(x)*f2(x) h(x)=f1(x)f2(x)

h ( x ) = ∑ d ∣ n f 1 ( d ) f 2 ( x d ) h(x)=\sum\limits_{d|n} f1(d)f2(\frac{x}{d}) h(x)=dnf1(d)f2(dx)

f ( x ) = f ( p 1 k 1 ) ∗ f ( p 2 k 2 ) ∗ . . . ∗ f ( p m k m ) ( x = p 1 k 1 p 2 k 2 . . . p m k m , i s p r i m e ( p i ) = 1 ) f(x)=f({p_1}^{k_1})*f({p_2}^{k_2})*...*f({p_m}^{k_m})(x={p_1}^{k_1}{p_2}^{k_2}...{p_m}^{k_m},isprime(p_i)=1) f(x)=f(p1k1)f(p2k2)...f(pmkm)(x=p1k1p2k2...pmkm,isprime(pi)=1)

积性函数的逆也是积性函数(什么是函数的逆,对于函数 f f f,若存在函数 g g g 使得 f ∗ g = ϵ f*g=\epsilon fg=ϵ,就说 g g g f f f 的逆(是不是有点像逆元的定义))

证明:不存在的

关于函数的逆,还有一点东西:

  • 如何去构造函数的逆:先给出结论,只要 f ( 1 ) ≠ 0 f(1) \neq 0 f(1)=0,那么 f f f 存在逆 g g g

首先, ( f ∗ g ) ( n ) = ∑ d ∣ n f ( d ) g ( n d ) (f*g)(n)=\sum\limits_{d|n} f(d)g(\frac{n}{d}) (fg)(n)=dnf(d)g(dn),把 d = 1 d=1 d=1 拆出来,得 ∑ d ∣ n , d ≠ 1 f ( d ) g ( n d ) + f ( 1 ) g ( n ) \sum\limits_{d|n,d≠1}f(d)g(\frac{n}{d})+f(1)g(n) dn,d=1f(d)g(dn)+f(1)g(n)

然后,我们递归构造 g ( n ) = ( e − ∑ d ∣ n , d ≠ 1 f ( d ) g ( n d ) ) f ( 1 ) g(n)=\frac{\left(e-\sum\limits_{d|n,d≠1}f(d)g(\frac{n}{d})\right)}{f(1)} g(n)=f(1)(edn,d=1f(d)g(dn))

带入上式得到 ∑ d ∣ n , d ≠ 1 f ( d ) g ( n d ) + f ( 1 ) ( e − ∑ d ∣ n , d ≠ 1 f ( d ) g ( n d ) ) f ( 1 ) = e \sum\limits_{d|n,d≠1}f(d)g(\frac{n}{d})+f(1)\frac{\left(e-\sum\limits_{d|n,d≠1}f(d)g(\frac{n}{d})\right)}{f(1)}=e dn,d=1f(d)g(dn)+f(1)f(1)(edn,d=1f(d)g(dn))=e

即构造出了 f f f 的逆 g g g。但是注意到 f ( 1 ) ≠ 0 f(1) \neq 0 f(1)=0

从某种意义上前置知识已经结束了


莫比乌斯反演

莫比乌斯函数

先随便写点东西。

现在有这么两个函数 F F F f f f

假定有:

F ( n ) = ∑ d ∣ n f ( d ) F(n)=\sum\limits_{d|n}f(d) F(n)=dnf(d)

如果你理解了卷积的概念:不难得到:

F ( n ) = ∑ d ∣ n ( 1 ∗ f ( d ) ) F(n)=\sum\limits_{d|n}(1 * f(d)) F(n)=dn(1f(d))
= ∑ d ∣ n ( I ( n d ) ∗ f ( d ) ) =\sum\limits_{d|n}(I(\frac{n}{d})*f(d)) =dn(I(dn)f(d)),其中 I ( d ) = 1 I(d)=1 I(d)=1
= I ∗ f =I * f =If

于是我们把 F F F 函数写成了卷积的形式。

有什么好处呢?

如果知道 f f f 函数,我们就可以得到 F F F 函数。

那么…如果我们知道 F F F 函数呢?

那我们就要写成 f = . . . f=... f=... 的形式,两边同乘 I − 1 I^{-1} I1,可得
f = F ∗ I − 1 f=F*I^{-1} f=FI1

所以 I − 1 I^{-1} I1 是个什么东西???这个时候大佬莫比乌斯站出来说, I − 1 = μ I^{-1}=\mu I1=μ
大家知道 I I I 是个积性函数, I ∗ I − 1 = ϵ I * I^{-1}=\epsilon II1=ϵ,所以 I − 1 I^{-1} I1 也是个积性函数。

研究一个积性函数,先研究其在质数的幂时的表现。——command_block

μ ( p 0 ) = 1 \mu(p^0)=1 μ(p0)=1(显然)

μ ( p 1 ) \mu(p^1) μ(p1) 怎么计算呢?注意到 ϵ ( p ) = ( μ ∗ I ) ( p ) \epsilon(p)=(\mu*I)(p) ϵ(p)=(μI)(p)

ϵ ( p ) = ∑ d ∣ p μ ( d ) I ( p d ) \epsilon(p)=\sum\limits_{d|p}\mu(d)I(\frac{p}{d}) ϵ(p)=dpμ(d)I(dp)
= ∑ d ∣ p μ ( d ) =\sum\limits_{d|p}\mu(d) =dpμ(d)

好像原地踏步了…?注意到 p p p 是个质数。

ϵ ( p ) = μ ( 1 ) + μ ( p ) \epsilon(p)=\mu(1)+\mu(p) ϵ(p)=μ(1)+μ(p)

由于 p > 1 p>1 p>1

0 = 1 + μ ( p ) 0=1+\mu(p) 0=1+μ(p)

得到 μ ( p ) = − 1 \mu(p)=-1 μ(p)=1

接着我们来看 μ ( p k ) \mu(p^k) μ(pk) 怎么算。

还是套用刚才的卷积形式:

ϵ ( p k ) = ∑ d ∣ p μ ( d ) I ( p k d ) \epsilon(p^k)=\sum\limits_{d|p}\mu(d)I(\frac{p^k}{d}) ϵ(pk)=dpμ(d)I(dpk)

再次去考虑 d d d 的取值,会发现 d = p 0 , p 1 . . . p k d=p^0,p^1...p^k d=p0,p1...pk 这些东西。

ϵ ( p k ) = μ ( p 0 ) I ( p k ) + μ ( p 1 ) I ( p k − 1 ) . . . + μ ( p k ) I ( p 0 ) \epsilon(p^k)=\mu(p^0)I(p^k)+\mu(p^1)I(p^{k-1})...+\mu(p^k)I(p^0) ϵ(pk)=μ(p0)I(pk)+μ(p1)I(pk1)...+μ(pk)I(p0)

ϵ ( p k ) = ∑ i = 0 k μ ( p i ) = 0 \epsilon(p^k)=\sum\limits_{i=0}^{k}\mu(p^i)=0 ϵ(pk)=i=0kμ(pi)=0

那么可以得到: μ ( p k ) = 0 ( k > 1 ) \mu(p^k)=0(k>1) μ(pk)=0(k>1)

当我们研究完了这个东西,注意到积性函数的一个性质:

f ( x ) = f ( p 1 k 1 ) ∗ f ( p 2 k 2 ) ∗ . . . ∗ f ( p m k m ) f(x)=f({p_1}^{k_1})*f({p_2}^{k_2})*...*f({p_m}^{k_m}) f(x)=f(p1k1)f(p2k2)...f(pmkm)

那就不难想到如果有一个 k i > 1 k_i >1 ki>1 μ ( x ) \mu(x) μ(x) 就等于 0 0 0,而其他情况 μ ( x ) = ± 1 \mu(x)=\pm1 μ(x)=±1。具体的:

μ ( n ) = { 0 d ∈ N + , d ≠ 1 , d 2 ∣ n ( − 1 ) ∑ d ∣ n ( i s p r i m e ( d ) = 1 ) other \mu(n) = \begin{cases} 0 & {d \in{\mathbb{N_+,d\neq1,d^2|n}}} \\ (-1)^{\sum\limits_{d|n}(isprime(d)=1)} & \text{other} \end{cases} μ(n)=0(1)dn(isprime(d)=1)dN+,d=1,d2nother

说人话就是若 n n n 存在一个大于 1 1 1 的平方因子,那么 μ ( n ) = 0 \mu(n)=0 μ(n)=0,否则就是 − 1 -1 1 k k k 次方,其中 k k k 表示 n n n 的质因数种类数。

既然知道了这些,作为一个臭名昭著著名的积性函数,它和欧拉函数一样可以筛出来:

void Mobius()
{
  e[1]=1;mu[1]=1;
  for (int i=2;i<=n;i++){
    if (!e[i]){p[++tn]=i;mu[i]=-1;}
    for (int j=1;j<=tn;j++){
      if (p[j]*i>n)break;
      mu[p[j]*i]=i%p[j]==0 ? 0 : -mu[i];
      e[p[j]*i]=1;
      if (i%p[j]==0)break;
    }
  }
}

(转自 command_block,有时间再补自己的)

莫比乌斯反演

终于…

嵌入式莫比乌斯反演

μ ∗ I = ϵ \mu*I=\epsilon μI=ϵ

∑ d ∣ n μ ( d ) = [ n = 1 ] \sum\limits_{d|n}\mu(d)=[n=1] dnμ(d)=[n=1]

然后:

[ n ∣ m ] [ n / m = 1 ] = [ n = m ] [n|m][n/m=1]=[n=m] [nm][n/m=1]=[n=m]

[ n ∣ m ] ∑ d ∣ ( n / m ) μ ( d ) = [ n = m ] [n|m]\sum\limits_{d|(n/m)}\mu(d)=[n=m] [nm]d(n/m)μ(d)=[n=m]

这个东西有什么用呢?来看这样一道题:

∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = 1 ] \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[gcd(i,j)=1] i=1nj=1m[gcd(i,j)=1]

我们把 g c d ( i , j ) gcd(i,j) gcd(i,j) 看成一个东西。

∑ d ∣ g c d ( i , j ) μ ( d ) = [ g c d ( i , j ) = 1 ] \sum\limits_{d|gcd(i,j)}\mu(d)=[gcd(i,j)=1] dgcd(i,j)μ(d)=[gcd(i,j)=1]

考虑什么是 d ∣ g c d ( i , j ) d|gcd(i,j) dgcd(i,j),也就是说 d ∣ i d|i di d ∣ j d|j dj

所以题目所求变为了 ∑ i = 1 n ∑ j = 1 m ∑ d ∣ i , d ∣ j μ ( d ) \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\sum\limits_{d|i,d|j}\mu(d) i=1nj=1mdi,djμ(d)

考虑变换求和顺序,注意到 ∑ d ∣ g c d ( i , j ) μ ( d ) = ϵ ≤ 1 \sum\limits_{d|gcd(i,j)}\mu(d)=\epsilon\le1 dgcd(i,j)μ(d)=ϵ1,所以可以改成 ∑ d = 1 d = n μ ( d ) × ∑ i = 1 , d ∣ i m ∑ j = 1 , d ∣ j n 1 \sum\limits_{d=1}^{d=n}\mu(d)\times\sum\limits_{i=1,d|i}^{m}\sum\limits_{j=1,d|j}^{n}1 d=1d=nμ(d)×i=1,dimj=1,djn1

是不是逐渐可做了?注意到每个 ⌊ n i ⌋ \lfloor \frac{n}{i} \rfloor in 都只有一个满足条件( j j j 同理),这个式子等价于 ∑ d = 1 d = n μ ( d ) × [ n / d ] [ m / d ] \sum\limits_{d=1}^{d=n}\mu(d)\times[n/d][m/d] d=1d=nμ(d)×[n/d][m/d]

这个向下取整的形式很类似于整除分块,我们看看怎么用整除分块维护,若确定了一段 d d d 后面两项的取值是相同的,可以 ( n ) (\sqrt n) (n ) 计算,但是 μ ( i ) \mu(i) μ(i) 怎么办?记录个前缀和就好了嘛!

也许这道题并不能看出数论分块的优秀复杂度,但是后面就能看出来了。

例题:

洛谷 P1390 公约数的和

题意:求 ∑ i = 1 n ∑ j = i + 1 m g c d ( i , j ) \sum\limits_{i=1}^{n}\sum\limits_{j=i+1}^{m}gcd(i,j) i=1nj=i+1mgcd(i,j)

这里介绍一个莫凡常用技巧:枚举 gcd,我们设 g c d ( i , j ) = g gcd(i,j)=g gcd(i,j)=g

当前的问题转化成求: ∑ i = 1 n ∑ j = i + 1 m ( g c d ( i , j ) = d ) \sum\limits_{i=1}^{n}\sum\limits_{j=i+1}^{m}(gcd(i,j)=d) i=1nj=i+1m(gcd(i,j)=d)

我们先考虑怎么计算 ∑ i = 1 n ∑ j = 1 m ( g c d ( i , j ) = g ) \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}(gcd(i,j)=g) i=1nj=1m(gcd(i,j)=g)

这个东西是个套路,把这东西换成是 i , j i,j i,j 互质,这样 g c d ( g i , g j ) gcd(gi,gj) gcd(gi,gj) 就可以一定是 g g g。原式改成 ∑ i = 1 ⌊ n g ⌋ ∑ j = 1 ⌊ m g ⌋ ( g c d ( i , j ) = 1 ) \sum\limits_{i=1}^{\lfloor \frac{n}{g}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{g}\rfloor}(gcd(i,j)=1) i=1gnj=1gm(gcd(i,j)=1)这东西大家都很熟了,直接改成重复上面的过程:

∑ i = 1 ⌊ n g ⌋ ∑ j = 1 ⌊ m g ⌋ ∑ d ∣ i , d ∣ j μ ( d ) \sum\limits_{i=1}^{\lfloor \frac{n}{g}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{g}\rfloor}\sum\limits_{d | i,d|j}\mu(d) i=1gnj=1gmdi,djμ(d)

∑ d = 1 m i n ( ⌊ n d ⌋ , ⌊ m d ⌋ ) μ ( d ) [ ⌊ ⌊ n g ⌋ d ⌋ ] [ ⌊ ⌊ m g ⌋ d ⌋ ] \sum\limits_{d=1}^{min(\lfloor \frac{n}{d}\rfloor,\lfloor \frac{m}{d}\rfloor)}\mu(d)[\lfloor\frac{\lfloor \frac{n}{g}\rfloor}{d}\rfloor][\lfloor\frac{\lfloor \frac{m}{g}\rfloor}{d}\rfloor] d=1min(dn,dm)μ(d)[dgn][dgm]

然后还要删去多算的东西,也就是:

∑ i = 1 n ∑ j = 1 m a x ( i , ⌊ m g ⌋ ) g c d ( i , j ) = 1 \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{max(i,\lfloor\frac{m}{g}\rfloor)} gcd(i,j)=1 i=1nj=1max(i,gm)gcd(i,j)=1

同样反演。

然后数论分块一下,预处理一下前缀和就好了(

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值