前置知识
狄利克雷卷积:f∗g=∑d|nf(d)g(nd)。
积性函数,线性筛。
数论分块。
单位函数:ε(n)=[n=1]。(积性函数)
常数函数:1(n)=1。(积性函数)
莫比乌斯函数
引理1: f(n) 是积性函数等价于 g(n)=∑d|nf(d) 是积性函数。
证明:
显然,g=f∗1,所以 f(n) 是积性函数可以推出 g(n) 是积性函数。
若 g(n) 是积性函数,归纳法。
首先,g(1)=f(1),因为 g(1)=g(1)g(1),所以 f(1)=g(1)=1。
假设对于所有小于 n 的值,f(n) 都是积性函数。
不妨设 n=ab,gcd(a,b)=1,则有:
g(n)=g(ab)=∑d|abf(d)=∑d1|a∑d2|bf(d1d2)=∑d1|a∑d2|bf(d1)f(d2)−f(a)f(b)+f(ab)
又因为:
g(n)=g(a)g(b)=∑d1|af(d1)∑d2|bf(d2)=∑d1|a∑d2|bf(d1)f(d2)
两式联立,得 −f(a)f(b)+f(ab)=0,即 f(n)=f(ab)=f(a)f(b),得证。
定义: 满足 ∑d|nμ(d)=ε(n) 的函数 μ 称作莫比乌斯函数。
性质1: 莫比乌斯函数是积性函数。
证明:
由于 ε(n) 是积性函数,根据引理1可知,μ(n) 也是积性函数。
性质2: p 为质数,则:
μ(pk)=⎧⎨⎩1k=0−1k=10k>1
说明:
代入定义的式子得到 ∑ki=0μ(pi)=ε(pk),推一下就可以得到。
性质3: 设 n 质因数分解后有 k 个不同的质因数,则:
μ(n)=⎧⎨⎩1n=10n有平方因子(−1)kOtherwise.
说明:
根据 μ(pk) 以及它是积性函数可得。
莫比乌斯反演
反演公式1:
g(n)=∑d|nf(d)⟺f(n)=∑d|nμ(nd)g(d)
反演公式2:
g(n)=∑n|df(d)⟺f(n)=∑n|dμ(dn)g(d)
证明:
这里只证明公式 1。
考虑狄利克雷卷积。
首先,狄利克雷卷积满足交换律,结合律。
则 g=f∗1,所以:
f(n)=∑d|nμ(nd)g(d)=μ∗g=μ∗(f∗1)=(μ∗1)∗f=ε∗f=f
得证。
证明2:
∑d|nμ(nd)g(d)=∑d|nμ(nd)∑d′|df(d′)=∑d|nf(d)∑d′=dj|nμ(nd′)=∑d|nf(d)∑j|ndμ(ndj)=∑d|nf(d)∑j|ndμ(j)=∑d|nf(d)ε(nd)=f(n)
得证。
应用
题目1: 求 ∑ni=x∑mj=y[gcd(i,j)=k]。(P2522 [HAOI2011] Problem b,P3455 [POI2007] ZAP-Queries)
思路:
只要求出 x=1,y=1 的情况就可以求出答案。
n∑i=1m∑j=1[gcd(i,j)=k]=⌊nk⌋∑i=1⌊mk⌋∑j=1[gcd(i,j)=1]=⌊nk⌋∑i=1⌊mk⌋∑j=1ε(gcd(i,j))=⌊nk⌋∑i=1⌊mk⌋∑j=1∑d|i,d|jμ(d)=∑d≥1μ(d)⌊nk⌋∑i=1⌊mk⌋∑j=1[d|gcd(i,j)]=∑d≥1μ(d)⌊nkd⌋⌊mkd⌋
预处理 μ 的前缀和,数论分块即可。
关键在于将 [n=1] 转化为 ∑d|nμ(d) 与交换求和顺序。
但是这其实只是利用了 ∑d|nμ(d)=[n=1] 这个结论,并没有真正的用反演公式。
其实用反演公式会非常显然。
设 f(k) 表示 ∑ni=1∑mj=1[gcd(i,j)=k],f(d) 即是答案。
设 g(k) 表示 ∑ni=1∑mj=1[k|gcd(i,j)],显然有:
g(k)=∑k|xf(x)
我们也可以直接计算出 g(k)=⌊nk⌋⌊mk⌋。
所以反演得到:
f(k)=∑k|xμ(x)g(xk)
也就是枚举所有 k 的倍数,和之前的式子其实是一样的。
相对而言,我们去找 f 和 g 会比直接推式子简单一些。
题目2: 求 ∑ni=1∑mj=1lcm(i,j),1≤n,m≤107。(P1829 [国家集训队] Crash的数字表格 / JZPTAB)
思路:
推式子。
n∑i=1m∑j=1lcm(i,j)=n∑i=1m∑j=1ijgcd(i,j)=∑k≥1n∑i=1m∑j=1[gcd(i,j)=k]ijk=∑k≥1⌊nk⌋∑i=1⌊mk⌋∑j=1[gcd(i,j)=1]ijk=∑k≥1k⌊nk⌋∑i=1⌊mk⌋∑j=1[gcd(i,j)=1]ij
记 f(N,M)=∑Ni=1∑Mj=1[gcd(i,j)=1]ij,则:
f(N,M)=N∑i=1M∑j=1[gcd(i,j)=1]ij=N∑i=1M∑j=1ij∑d|i,d|jμ(d)=∑d≥1μ(d)⌊Nd⌋∑i=1⌊Md⌋∑j=1ijd2=∑d≥1μ(d)d2⌊Nd⌋∑i=1⌊Md⌋∑j=1ij
记 g(N,M)=∑Ni=1∑Mj=1ij,显然 g(N,M)=NM(N+1)(M+1)4。
所以上式等于:
∑d≥1μ(d)d2g(⌊Nd⌋,⌊Md⌋)
记 h(n)=μ(n)n2,显然是个积性函数,我们可以预处理它的前缀和,然后配合数论分块在 O(√N) 的时间内算出 f(N,M),最后的答案即为:
∑k≥1kf(⌊nk⌋⌊mk⌋)
再次数论分块,调用 f(N,M) √n 次,所以最终的复杂度是 O(n) 的。
同理,我们也可以用反演公式来推。
记:
f(k)=n∑i=1m∑j=1[gcd(i,j)=k]ijk
g(k)=∑k|df(d)
推一下 g(k):
g(k)=∑k|df(d)=n∑i=1m∑j=1[k|gcd(i,j)]ijk=⌊nk⌋∑i=1⌊mk⌋∑j=1[gcd(i,j)=1]ijk=k⌊nk⌋∑i=1⌊mk⌋∑j=1[gcd(i,j)=1]ij
然后就和上面的一样了。
题目3: 题意同上,多组询问,T≤104,n,m≤107。(BZOJ 2693)
思路:
很明显我们需要优化上题。
上题我们得到的式子:
f(N,M)=∑d≥1μ(d)d2g(⌊Nd⌋,⌊Md⌋)
答案即为:
n∑k=1kf(⌊nk⌋⌊mk⌋)
现在我们将 f 展开,代入答案得到:
n∑k=1kf(⌊nk⌋⌊mk⌋)=n∑k=1k∑d≥1μ(d)d2g(⌊ndk⌋⌊mdk⌋)
关键转化:令 T=dk,将枚举 (d,k) 改为枚举 (T,d)。
上式变为:
n∑k=1k∑d≥1μ(d)d2g(⌊ndk⌋⌊mdk⌋)=n∑T=1∑d|Tμ(d)d2Tdg(⌊nT⌋⌊mT⌋)=n∑T=1g(⌊nT⌋⌊mT⌋)T∑d|Tμ(d)d
令 h(T)=T∑d|nμ(d)d,这个函数是个积性函数,可以 O(n) 预处理出来前缀和。而 g(N,M) 是可以 O(1) 计算的。所以单次询问可以直接数论分块,时间复杂度 O(T√n)。
转化非常关键!!!
题目4: 假设我们有一个集合 S∈Z+,求:
n∑i=1m∑j=1[gcd(i,j)∈S]
思路:
这其实是一类问题:P2257 YY的GCD(S 是质数集合),HDU5663 Hillan and the girl(S 是平方数集合)。
其实都是一个方法。
我们先推式子:
n∑i=1m∑j=1[gcd(i,j)∈S]=∑d∈Sn∑i=1m∑j=1[gcd(i,j)=d]=∑d∈S⌊nd⌋∑i=1⌊md⌋∑j=1[gcd(i,j)=1]=∑d∈S⌊nd⌋∑i=1⌊md⌋∑j=1∑k|i,k|jμ(k)=∑d∈S∑k≥1μ(k)⌊ndk⌋∑i=1⌊mdk⌋∑j=11=∑d∈S∑k≥1μ(k)⌊ndk⌋⌊mdk⌋
然后,还是刚才的关键转化:将 (d,k) 换成 (d,T)。
∑d∈S∑k≥1μ(k)⌊ndk⌋⌊mdk⌋=n∑T=1∑d|T,d∈Sμ(Td)⌊nT⌋⌊mT⌋=n∑T=1⌊nT⌋⌊mT⌋∑d|T,d∈Sμ(Td)
记 f(T)=∑d|T,d∈Sμ(Td),显然可以预处理出来,时间复杂度低于 O(nloglogn),然后数论分块即可单次 O(√n) 时间解决。
题目5: 多组询问,求:
n∑i=1m∑j=1σ(gcd(i,j))[σ(gcd(i,j))≤a]
P3312 [SDOI2014] 数表
思路:
同理,还是推式子,过程不写了,我们将原式化为:
n∑d=1σ(d)[σ(d)≤a]∑k≥1μ(k)⌊ndk⌋⌊mdk⌋
然后还是将 (d,k) 变为 (T,k) 可以变为:
n∑T=1⌊nT⌋⌊mT⌋∑d|T[σ(d)≤a]σ(d)μ(Td)
考虑到是多组询问,a 会变,我们将询问离线,按照 a 升序排序,然后依次将 σ(d) 从小到大加入贡献。
为了数论分块,我们要支持单点修改和区间查询,树状数组即可,时间复杂度 O(nloglognlogn)。
题目6: 多组询问,求:
n∑i=1m∑j=1d(ij)
d(n) 表示 n 的约数个数。(P3327 [SDOI2015] 约数个数和)
思路:
首先,我们有一个关于 d(ij) 的公式:
d(ij)=∑x|i∑y|j[gcd(x,y)=1]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)