莫比乌斯反演

基础知识

  • 两个积性函数 f,g ,它们的 狄利克雷卷积(Dirichlet卷积)

h(n)=(fg)(n)=d|nf(d)g(nd)

记为 h=fg .

  • 狄利克雷卷积满足 交换律,结合律,且得到的函数也是 积性函数

定义

ϵ(n)=[n=1],I(n)=1,id(n)=n

ϵ 即该运算意义下的单位元,因为一定有

g(n)=(fϵ)(n)=d|nf(d)ϵ(nd)=f(n)

g=f,f=fϵ .


常用函数的三个结论:

  • μI=ϵ

即证

d|nμ(d)=[n=1]

n=1 时显然成立。

n=i=1mpici ,当 d 有平方因子 ( 不包括 1 ) 时贡献为 0 .

n=i=1mpi ,求 d|nμ(d) 即可。

容易发现 n 的所有质因子有 2m 种组合,枚举质因子的个数,即

i=0m(1)iC(m,i)=(1+1)m=0

得证。

  • φI=id

d|nφ(d)=n ,这里不写。

  • idμ=φ

用的不会很多。

利用狄利克雷卷积的结合律,在前一个式子的两边乘上一个 μ ,由 μI=ϵ 可推该式。


P3455 [POI2007]ZAP-Queries

求满足 1an1bm,且 gcd(a,b)=d 的二元组 (a,b) 的数量。

1T5×1041dn,m5×104


本文默认 nm .

nnd,mmd ,求

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

后面的艾弗森括号就等价于 ϵ(gcd(i,j)),展开得到

i=1nj=1md|gcd(i,j)μ(d)

d 提到前面:

d=1nμ(d)ndmd

预处理 μ 并做前缀和,询问时 O(n) 整除分块即可。


P2257 YY的GCD

条件变成 gcd 为质数。

1T1041n,m107


枚举 gcd(i,j) 可得

d=1n[dPrime]i=1ndj=1md[gcd(i,j)=1]

d=1n[dPrime]p=1ndμ(p)ndpmdp

有一个trick,令 T=dp ,然后再把 T 提到前面去:

T=1nnTmTd|Tμ(Td)[dPrime]

后半部分的东西可以 O(n log log n) 求出来,询问也是 O(n) 的。

还有trival的例题不写了。


莫比乌斯变换

  • g(n)=d|nf(d) ,则 f(n)=d|ng(d)μ(nd) .

  • g(n)=n|df(d) ,则 f(n)=n|dg(d)μ(dn) .

这两个式子称为 莫比乌斯变换 。两个函数 不需要一定是积性函数

第一个:由 g=fI 显然可以得到 f=gμ .

第二个:反推。

n|dg(d)μ(nd)

d=1μ(d)g(nd)

d=1μ(d)nd|pf(p)

p=1f(np)d|pμ(d)

=f(n)


P3172 [CQOI2015]选数

一个长为 n ,值域为 L,R 的数列 A ,求

A[gcdi=1nAi=k]

n,L,R,k109,RL105 .


先将 LLk , RRk .

f(m)gcd 刚好为 m 的种数,g(m)gcdm 的倍数的种数,那么 f(1) 即为所求。

容易得到:

g(m)=m|df(d)

f(m)=m|dμ(dm)g(d)

想一下怎么得到每一个 g(m) .

显然就是

g(m)=(RmL1m)n

答案是

f(1)=i=1μ(i)g(i)

一样的 g 可以整除分块,所以要做 μ 的前缀和。

要用杜教筛。


P3312 [SDOI2014]数表

i=1nj=1mσ1(gcd(i,j))[σ1(gcd(i,j))a]

σ1 是因子之和。

T2×104,n,m105,|a|109 .

不考虑 a ,那么

i=1nj=1mσ1(gcd(i,j))

d=1nσ1(d)p=1ndμ(d)ndpmdp

T=1nnTmTd|Tσ1(d)μ(nd)

如果套上 a 直接做单次是 O(n log n) 的。

考虑离线,将所有的 σ1(d) 和询问的 a 排序,更换询问时就能不重复地添加。

统计答案时要用到整除分块,所以应该得到一个区间和的形式,用树状数组实现操作。

这样复杂度就是 O(n log2 n+Tn log n) .


P3327 [SDOI2015]约数个数和

i=1nj=1md(ij)

d 是约数个数,也可以写成 σ0 .


有结论:d(ij)=x|iy|j[xy]

考虑一个质因子 p,且 i=pαj=pβ 的情况。

发现两边都是 α+β+1,应该就能证了。

代回去:

i=1nj=1mp|gcd(i,j)μ(p)d(ip)d(jp)

p=1nμ(p)i=1npj=1mpd(i)d(j)

就做完了。


P1829 [国家集训队]Crash的数字表格 / JZPTAB

i=1nj=1mlcm(i,j)

n,m107 .


d=1ni=1nj=1mijd[gcd(i,j)=d]

d=1ndi=1ndj=1mdij[gcd(i,j)=1]

把后面那个东西提出来单独做式子看起来舒服方便一点。

S(n,m)=i=1nj=1mij[gcd(i,j)=1]

d=1nμ(d)d2i=1ndj=1mdij

后半可以整除分块。

代回去:

d=1ndS(nd,md)

也可以整除分块。

分块套分块的复杂度是 O(n34) 的。


P4466 [国家集训队]和与积

1a<bn[a+b| ab]

n<231 .


gcd(a,b)=1 时,显然有 a+bab .

a=di,b=dj ,那么 i+jijd .

因为 i+jij ,所以 i+jd.

i=1nj=1i1nii+j[gcd(i,j)=1

i>n 时里面式子就恒为 0 了。

i=1nj=1i1nii+j[gcd(i,j)=1

i=1nj=1i1nii+jp|i,p|jμ(p)

p=1nμ(p)i=1npj=1i1nipip+jp

p=1nμ(p)i=1npj=1i1nip2i+j

暴力枚举 p,i ,后面的式子是可以整除分块的。


P4213 【模板】杜教筛(Sum)

i=1nφ(i)

i=1nμ(i)

T10n<231 .


设待求函数为 f ,其前缀和为 S ,且 h=fg ,那么 h 的前缀和

i=1nh(i)=i=1nd|ig(d)f(id)

d=1ng(d)S(nd)

显然有

g(1)S(n)=i=1nh(i)i=2ng(i)S(ni)

任务是找到方便计算前缀和的 g,h ,简化原式的计算。

f=φ ,取 g=I,h=idh 的前缀和就是 n(n+1)2g 的前缀和就是 n .

f=μ ,取 g=I,h=ϵh 的前缀和就是 1

大概预处理 106 级别的答案,询问时暴力整除分块,得到的答案可以用 map 或者 unordered map 存下来.

代码不放,自己去贺。

复杂度是 O(n23) 的。


*P1587 [NOI2016] 循环之美

x=1ny=1mxy 为最简分数,且在 k 进制下是纯循环小数或整数。

n,m109,2k2×103


设循环节长度为 l ,则 xyxkly 的小数部分相等。

xyxy=xklyxkly

xxyy=xklxklyy

xxkl (mod y)

xy 为最简分数得 gcd(x,y)=1 :

kl1 (mod y)

答案就是

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

其中的一种方法:

j=1m[gcd(j,k)=1]i=1nd|gcd(i,j)μ(d)

j=1m[gcd(j,k)=1]d|jnμ(d)nd

d=1nμ(d)ndj=1md[gcd(dj,k)=1]

d=1nμ(d)nd[gcd(d,k)=1]j=1md[gcd(j,k)=1]

把后面那串式子记成

f(n)=i=1n[gcd(i,k)=1]

显然有

f(n)=nkφ(k)+f(n mod k)

k 以内的部分可以直接算。

考虑计算

g(n,k)=d=1nμ(d)[gcd(d,k)=1]

d=1nμ(d)p|d,p|kμ(p)

p|kμ(p)p|dμ(d)

p|kμ(p)d=1npμ(dp)

无效贡献对式子无影响,变成

p|kμ(p)d=1npμ(dp)[gcd(d,p)=1]

p|kμ(p)d=1npμ(d)μ(p)[gcd(d,p)=1]

p|kμ2(p)d=1npμ(d)[gcd(d,p)=1]

p|kμ2(p)g(np,p)

边界值 g(0,k)=0g(n,1)=d=1nμ(d) .

然后就要用杜教筛。


P3768 简单的数学题

i=1nj=1nijgcd(i,j)

答案对质数 p 取模 。


一个较妙的做法。

i=1nj=1nijid(gcd(i,j))

这里用到 φI=id .

i=1nj=1nijd|i,d|jφ(d)

d=1nφ(d)d|id|jij

d=1nφ(d)d2(i=1ndi)2

nd 可以整除分块,里面的式子的前面和需要杜教筛。

也就是 f=φid2 ,考虑取 g=id2 ,那么

h(n)=d|nf(d)g(nd)=n2d|nφ(n)=n3 .

h=id3 .

然后杜教筛就不难了。


*P4240 毒瘤之神的考验

i=1nj=1mφ(ij)

T104,n,m105 .


有个结论:

φ(ij)=φ(i)φ(j)dφ(d)

d=(i,j) ,这个结论还是很好证的。

d=1ndφ(d)i=1ndj=1mdφ(id)φ(jd)[gcd(i,j)=1]

d=1ndφ(d)p=1ndμ(p)i=1ndpj=1mdpφ(idp)φ(jdp)

T=1nd|Tdμ(Td)φ(d)i=1nTφ(iT)j=1mTφ(jT)

前面那坨函数记为 f(T) .

G(y,x)=i=1xφ(iy) ,也就是

T=1nf(T)G(nT,T)G(mT,T)

显然这个式子只能 O(n) ,直接T飞。

所以再记一个 S(y,z,x)=T=1xf(T)i=1yφ(iT)j=1zφ(jT)

考虑递推,容易得到

G(y,x)=G(y,x1)+φ(xy)

S(y,z,x)=S(y,z,x1)+f(x)G(x,y)G(x,z)

接着就可以用牛逼分治,就是说设一个阈值 B ,对于 nTB 的部分直接算,后面的再用分块算,有点不好看懂放个代码。

int query(int n,int m){
if(n>m)swap(n,m);
int ret=0;
for(int i=1;i<=m/B;i++)
(ret+=1ll*f[i]*G[i][n/i]%Mod*G[i][m/i]%Mod)%=Mod;
for(int x=m/B+1,gx;x<=n;x=gx+1){
gx=min(n/(n/x),m/(m/x));
(ret+=(S[n/x][m/x][gx]-S[n/x][m/x][x-1]+Mod)%Mod)%=Mod;
}
return ret;
}

算下复杂度是 O(n ln n+nB2+T(n+nB)) .

平衡复杂度不太会算,应该是取 B=T13 ,平衡复杂度 O(n ln n+Tn+nT23) .

所以就是牛逼东西。


*P5572 [CmdOI2019]简单的数论题

这道题也是一样的trick.

i=1nj=1mφ(lcm(i,j)gcd(i,j))


d=1ni=1ndj=1mdφ(ij)[gcd(i,j)=1]

d=1ni=1ndj=1mdφ(i)φ(j)[gcd(i,j)=1]

d=1np=1ndμ(p)i=1ndpφ(ip)j=1mdpφ(jp)

T=1nd|Tμ(d)i=1nTφ(id)j=1mTφ(jd)

一样记 G(y,x)=i=1xφ(iy)

S(y,z,x)=T=1xd|Tμ(d)G(d,y)G(d,z)

那么

G(y,x)=G(y,x1)+φ(xy)

S(y,z,x)=S(y,z,x1)+d|xμ(d)G(y,d)G(z,d)

阈值为 B ,算下时间应该是 O(B2 nlnn+T(n+nBlnnB)) .

平衡复杂度不会算就乱取一个。


*P3700 [CQOI2017] 小 Q 的表格

n×n 的表格满足:

f(a,b)=f(b,a)

b×f(a,a+b)=(a+b)×f(a,b)

一开始有 f(a,b)=a×b,满足表格的条件。

m 次操作,每次一个格子的数被修改且波及其他格子。然后给出 k,求左上角 k×k 的矩阵的数之和。答案对 1e9+7 取模。

m104n4×106,值域 1e18.


从表格的对称性入手:

gcd(a,a+b)=gcd(a+b,a)=gcd(a,a+ba)=gcd(a,b)

所以修改 (a,b) 的值会影响到 gcd(x,y)=gcd(a,b)(x,y) 的值。

转换一下第二个式子:

f(a,b)a×b=f(a,a+b)a×(a+b)

辗转相除的过程中一直递归下去:

f(a,b)a×b=f((a,b),(a,b))(a,b)2

那么

d(a,b),f(a,b)=abd2f(d,d)

f(d,d)f(d),即求

i=1nj=1nijd2f(d,d)

枚举 gcd

d=1nf(d)i=1ndj=1nd[ij]ij

后面的式子由于有

i=1n[in]i=nφ(n)+ϵ(n)2

思考一下就变成了

d=1nf(d)i=1ndi2φ(i)

S(n)=i=1ni2φ(i),就可以整除分块了。

然后发现 f 是动态的而且还要作前缀和。

不考虑数据结构的复杂度是 O(mn) 的。

O(1) 查询不难想到分块,把 f 变为前缀和序列,单点修改改为区间修改,这样总复杂度 O(mn).

分块被卡成了儿子。。。树状数组跑得十分快。


*P4619 [SDOI2018] 旧试题

多测,求

i=1Aj=1Bk=1Cd(ijk)(mod109+7)

T101A,B,C1051max(A,B,C)2×105。时限 5s。


快进到

d1=1Aμ(d1)d2=1Bμ(d2)d3=1Cμ(d3)x=1Alcm(d1,d2)Alcm(d1,d2)xy=1Blcm(d2,d3)Blcm(d2,d3)yz=1Clcm(d3,d1)Clcm(d3,d1)z

V=max(a,b,c),三元组 (d1,d2,d3) 有贡献则:

  • μ(d1),μ(d2),μ(d3)0
  • lcm(d1,d2),lcm(d2,d3),lcm(d3,d1)V

μ(x)=0 的点删除,将 lcm(x,y)V 的连边,然后枚举三元环计数。

如何连边:令 j=pd,k=qd(pq),若 pqdV 则连边。

枚举三元环:枚举度数小的作为入边。是 O(mm) 的。计数要判断三个点有几个相同。

zky 写的是 m 最大为 821535

P6271 [湖北省队互测2014] 一个人的数论

之前贺完写的东西被自己删了。

i=1nik[in]

其中 n=piαi

pi,αi109ω(n)103


构造

F(n)=i=1nik

G(n)=i=1nik[in]

那么 G(n) 为所求。

由于

F(n)=d|ndkG(nd)

G(n)=d|nμ(d)dkF(nd)

F(n) 视作关于 nk+1 次多项式:

G(n)=d|nμ(d)dki=0k+1fi(nd)i=i=0k+1finid|nμ(d)dki

μ(d)dki 是积性函数,利用 n 的分解式:

G(n)=i=0k+1finipj|nt=0ajμ(pjt)pjt(ki)

故将 t 枚举至 1 即可,那么

G(n)=i=0k+1finipj|n(1pjki)

f 可以高消 O(k3) 或者拉插 O(k2)

*P5518 [MtOI2019] 幽灵乐团 / 莫比乌斯反演基础练习题

暂时不考虑补过程。

本文作者:SE の 摆烂窝

本文链接:https://www.cnblogs.com/SError0819/p/17609849.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   SError  阅读(10)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起