This page looks best with JavaScript enabled

莫比乌斯反演入门题目-题解

 ·  ✏️ About  2712 words  ·  ☕ 6 mins read · 👀17 views

以下有几道莫比乌斯反演入门题的详尽版的题解(公式推演)。

[POI2007]ZAP-Queries🔗

题意🔗

求:
i=1nj=1m[gcd(i,j)=d]


解法1🔗

倒一倒式子:
ans=i=1nj=1m[gcd(i,j)=d] =i=1ndj=1md[gcd(i,j)=1] 


f(d)=i=1xj=1y[gcd(i,j)=d] 

若:
g(d)=d|kf(k)

则可以发现 g(d)=xdyd

反演得:
f(d)=d|kμ(kd)g(k)

那么:
f(1)=k=1min(x,y)μ(k)g(k)

所以:
ans=f(1)=k=1min(nd,md)μ(k)g(k) =k=1min(nd,md)μ(k)xdyd 

可以利用整除分块,单次查询时间时间复杂度 O(n)。所以时间复杂度是 O(n+Tn)

[HAOI2011]Problem b🔗

题意🔗

求:
x=aby=cd[gcd(x,y)=d]


解法🔗

设:
ans=F(a,b,c,d)=x=aby=cd[gcd(x,y)=d], G(n,m)=x=1ny=1m[gcd(x,y)=d]
利用容斥原理,可以发现这个式子可以转化成
F(a,b,c,d)\=G(b,d)G(a1,d)G(b,c1)+G(a1,c1)
然后每一个 G(n,m) 都可以按照上题的单次 O(n) 的做法求出。所以时间复杂度是 O(n+Tn)

YY的GCD🔗

题意🔗

求:
i=1kx=1ny=1m[gcd(i,j)=pi] 


解法1🔗

i=1kx=1ny=1m[gcd(i,j)=pi] =i=1kx=1npiy=1mpi[gcd(i,j)=1]


f(k)=i=1nj=1m[gcd(i,j)=k]


g(k)=k|df(d)=nkmk

莫比乌斯反演得

f(k)=k|dμ(dk)g(d)=i=1min(n,m)kμ(i)g(ik) =i=1min(n,m)kμ(i)nikmik

所以

f(1)=i=1min(n,m)μ(i)nimi

则原式:

i=1kx=1npiy=1mpi[gcd(i,j)=1] =i=1kd=1min(npi,mpi)μ(d)ndpimdpi 

Ti=dpi,则有:
原式
i=1kd=1min(npi,mpi)μ(d)ndpimdpi =i=1kd=1min(npi,mpi)μ(Tipi)nTimTi =i=1kpi|Tμ(Tpi)nTmT =T=1min(n,m)pi|Tμ(Tpi)nTmT =T=1min(n,m)nTmTpi|Tμ(Tpi) 


h(x)=pi|xμ(xpi)

所以原式化为:

T=1min(n,m)nTmTpi|Tμ(Tpi) =i=1min(n,m)nimih(i)

只需要求出 h(i) 的前缀和,我们就可以 O(n) 整除分块算出。

观察
h(x)=pi|xμ(xpi)

可以发现,如果我们枚举每个质数,再将所有的该质数的倍数的g[i * prime[j]] += mu[i]都加上去。

由于枚举倍数的调和级数 n1+n2++nn=O(lnn+r) ,所以这个枚举过程的复杂度是 O(nlnn) 的。

注意到这个 h(x) 应当也是一个积性函数,所以事实上可以在线性素数筛的时候直接计算出 h(x) 的值,这个过程就是 O(n) 的。

[NOI2010]能量采集🔗

题意🔗

给定两个整数n,m,对于平面上的整点 (x,y)|x[1,n],y[1,m],x,yZ 。若 (x,y)(0,0) 的连线上有 k 个整点(不包括 (0,0) , (n,m)),则产生的贡献为 2k+1 。求所有满足条件的点的贡献总和。


解法🔗

一个结论:从 (0,0)(n,m) 的线路上,有 gcd(n,m)1 个整点(不包括 (0,0) , (n,m) )。

想一想很好明白:令 tn,m 的公因数 (nt,mt) 就相当于步长, m,n 一定时 t 越大,步长越小,整点就越多。 gcd(n,m)n ,m 的最大公因数,所以就是最多整点的个数了。

所以问题转化为:

i=1nj=1m2×gcd(n,m)1
的值。

我们进行一些微小的变换:

i=1nj=1m2×gcd(n,m)1 =(2i=1nj=1mgcd(n,m))n×m

问题转化为求:
i=1nj=1mgcd(n,m)


ans=i=1nj=1mgcd(n,m) =d=1min(n,m)d×(i=1ndj=1md[gcd(i,j)=1]) 

设:

f(d)=i=1xj=1y[gcd(i,j)=d]

由第一题,可以发现:

f(1)=i=1min(x,y)μ(i)xiyi

回代得:

ans=d=1min(n,m)d×(i=1min(nd,md)μ(i)nidmid) 

T=id,可以得到:
ans=d=1min(n,m)d×(i=1min(nd,md)μ(i)nTmT) 

改为枚举 T,得到:
ans=T=1min(n,m)nTmT(d|Tμ(Td)d)

如果令:
h(T)=d|Tμ(Td)d

发现 h(T) 是一个积性函数,所以可以 O(n) 线性筛出来, 然后就可以得到:

ans=T=1min(n,m)h(T)nTmT

利用整除分块可以做到 O(n) 单次询问。

时间复杂度: O(n+n)


这题亦可 O(nlogn) 手动模拟容斥原理。

[国家集训队]Crash的数字表格🔗

题意🔗

求:
x=1ny=1mlcm(x,y)
数据范围: n,m107


解法1 O(n)🔗

x=1ny=1mlcm(x,y) =x=1ny=1mxygcd(x,y)

我们可以枚举 gcd(x,y) 的值 d ,然后就把式子化成:
x=1ny=1mxygcd(x,y) =d=1min(n,m)x=1ny=1mxyd[gcd(x,y)=d] =d=1min(n,m)d;i=1ndj=1mdij[gcd(i,j)=1] 

设:
F(x,y)=i=1xj=1yij[gcd(i,j)=1] 

则:
ans=d=1min(n,m)dF(nd,md)


设:
h(x,y)=i=1xj=1yij=x(x+1)2y(y+1)2

h(x,y) 可以 O(1) 计算得到。


我们进行莫比乌斯反演,尝试求出 F(x,y) 的值:

(以下默认上界分别为 x,y

f(d)=i=1xj=1yij[gcd(i,j)=d],g(d)=d|kf(k) 

我们发现, g(d) 事实上可以表示为:

g(d)=d2×i=1xdj=1ydij=d2×h(xd,yd)

经过反演:

f(d)=d|kμ(kd)g(k) =d|kμ(kd)k2h(xk,yk)

所以:

f(1)=k=1min(x,y)μ(k)k2h(xk,yk)

那么,
F(x,y)=f(1)=k=1min(x,y)μ(k)k2h(xk,yk)

这个东西可以整除分块,所以我们每计算一个 F(x,y) 的复杂度是 O(n),根据:

ans=d=1min(n,m)dF(nd,md)

我们发现,这里对于所有的 d 来说, ndmd 也最多分别有 n 个取值,所以我们最多只需要计算 O(n)F(x,y) ,所以最后的时间复杂度是 O(n)

解法2 O(n+Tn)🔗

我们有
ans=d=1min(n,m)dF(nd,md)

又:
F(x,y)=k=1min(x,y)μ(k)k2h(xk,yk) 

代入得:
ans=d=1min(n,m)dk=1min(nd,md)μ(k)k2h(ndk,mdk)

dk=T,则有:

ans=d=1min(n,m)dk=1min(nd,md)μ(k)k2h(nT,mT)

枚举 T ,则有:
ans=T=1min(n,m)d|TdTd2μ(Td)h(nT,mT)

简单整理下:

ans=T=1min(n,m)h(nT,mT)d|TTdd2μ(d)

拎出来后面的一坨:
f(T)=d|TTdd2μ(d)

发现这是一个积性函数,所以可以 O(n) 线性筛出来,然后就可以配合整除分块 O(n) 完成单词询问。

[SDOI2015]约数个数和🔗

题意🔗

d(x)x 的约数个数,给定 NM ,求

i=1Nj=1Md(ij)


解法🔗

我们有如下结论:

d(ij)=x|iy|j[gcd(x,y)=1]

证明:

我们对 ij 两个数做唯一分解 ,得到:
i=p1a1×p2a2××pnan j=p1b1×p2b2××pnbn 

所以我们知道
d(ij)=x=1n(ax+bx+1)

我们需要证明,分别从 ij 中选择两个互质的约数的方案数也等于上式。

我们发现,在约数的构造中,不同质因子的选取是独立的。所以我们只需要考虑一个质因子的选取方案数,然后把所有质因子做一个连乘即可。

因为不能有公共的因子,所以对 p1 这个质因子来说,我们可以正好找出 a1+b1+1 种选取方法,分别为:

(1,0),(2,0),,(a1,0) (0,1),(0,2),,(0,b1) (0,0)

可以证明,这些不同的的选取可以保证我们选择的因数不会完全相同。

所以可以证明:
d(ij)=x|iy|j[gcd(x,y)=1]


原式:

i=1Nj=1Md(ij) =i=1Nj=1Mx|iy|j[gcd(x,y)=1] =x=1Ny=1Mx|iy|j[gcd(x,y)=1] =x=1Ny=1M[gcd(x,y)=1]x|iy|j1 =x=1Ny=1M[gcd(x,y)=1]NxMy 


f(d)=x=1Ny=1M[gcd(x,y)=d]NxMy 


g(d)=d|if(i)

可以发现,此时 x,y 为所有 d 的倍数,所以:
g(d)=i=1Ndj=1MdNidMjd

进行一步反演:
f(d)=d|kμ(kd)g(k)

则:

f(1)=k=1min(n,m)μ(k)g(k) =k=1min(n,m)μ(k)i=1Nkj=1MkNikMjk =k=1min(n,m)μ(k)(i=1NkNik)(j=1MkMjk) 

我们发现:

x=1nd(x)=i=1nni

所以:

ans=k=1min(n,m)μ(k)(i=1NkNik)(j=1MkMjk) =k=1min(n,m)μ(k)i=1Nkd(i)j=1Mkd(j) 

令:

h(x)=i=1xd(i)

则:

ans=k=1min(n,m)μ(k)h(Nk)h(Mk) 

我们发现 d(i) 是一个积性函数,可以 O(n) 线性筛,然后 h(x) 可以 O(n) 前缀和,然后就可以 O(n) 整除分块单次出解。


cqqqwq
WRITTEN BY
cqqqwq
A student in Software Engineering.


Comments