以前都是抄的,现在重新学。很菜勿喷。
积性函数 f(ab)=f(a)f(b),gcd(a,b)=1
φ,μ,σ,d
完全积性函数 f(ab)=f(a)f(b)
I(x)=1,id(x)=x,ϵ(x)=[x=1]
设有两个函数 f 和 g,他们的
狄利克雷卷积 (f∗g)=∑d|nf(d)g(nd)
- f∗ϵ=f
- μ∗I=ϵ
- φ∗I=id
- μ∗id=φ
莫比乌斯反演 f(n)=∑d|ng(d)→g(n)=∑d|nμ(d)f(nd)
证明:f∗μ=g∗I∗μ=g∗ϵ=g。
1.求n∑i=1n∑j=1gcd(i,j)
Link
引理 1 ∑d|nμ(d)=[n=1]
证明:由 μ∗I=ϵ 易得。
引理 2 n∑i=1∑d|iμ(d)=n∑d=1⌊nd⌋μ(d)
显然。
推论 n∑i=1m∑j=1[gcd(i,j)=1]=min(n,m)∑d=1μ(d)⌊nd⌋⌊md⌋
证明:n∑i=1m∑j=1[gcd(i,j)=1]
由引理 1 知,n∑i=1m∑j=1∑d|gcd(i,j)μ(d)n∑i=1m∑j=1∑d|i∑d|jμ(d)n∑i=1∑d|im∑j=1∑d|jμ(d)
由引理 2 知,n∑i=1∑d|im∑d=1⌊md⌋μ(d)n∑d=1⌊nd⌋m∑d=1⌊md⌋μ(d)min(n,m)∑d=1⌊nd⌋⌊md⌋μ(d)
证毕。
n∑i=1n∑j=1gcd(i,j)n∑d=1dn∑i=1n∑j=1[gcd(i,j)=d]
令 s=⌊nd⌋
n∑d=1ds∑i=1s∑j=1[gcd(i,j)=1]
由推论得n∑d=1ds∑q=1μ(q)⌊sq⌋2n∑d=1d⌊nd⌋∑q=1μ(q)⌊ndq⌋2
可以线性筛预处理 μ 的前缀和,枚举 d,对 ⌊sq⌋ 整除分块,时间复杂度 O(n)。
2.求n∑i=1m∑j=1[gcd(i,j)∈prime]
Link
假设 n≤m
k≤n,k is prime∑k=1n∑i=1m∑j=1[gcd(i,j)=k]k≤n,k is prime∑k=1⌊nk⌋∑i=1⌊mk⌋∑j=1[gcd(i,j)=1]k≤n,k is prime∑k=1n∑d=1μ(d)⌊nkd⌋⌊mkd⌋
令 s=kd
k≤n,k is prime∑k=1n∑d=1μ(d)⌊ns⌋⌊ms⌋n∑s=1⌊ns⌋⌊ms⌋k is prime∑k|sμ(sk)
右边那个可以预处理,就做完了,时间复杂度 O(n+T√n)。
3.求n∑i=1m∑j=1σ(gcd(i,j))[σ(gcd(i,j))≤a]
Link
假设 n≤m
先推n∑i=1m∑j=1σ(gcd(i,j))n∑d=1σ(d)⌊nd⌋∑i=1⌊md⌋∑j=1[gcd(i,j)=1]n∑d=1σ(d)⌊nd⌋∑p=1μ(p)⌊ndp⌋⌊mdp⌋
令 s=dp
n∑s=1∑d|sσ(d)μ(sd)⌊ns⌋⌊ms⌋n∑s=1⌊ns⌋⌊ms⌋∑d|sσ(d)μ(sd)
令 f(s)=∑d|sσ(d)μ(sd)[σ(d)≤a]
现在要求 σ(d)≤a,则将询问离线,将 a 从小到大排序,对新加入的 σ(d) 枚举 s,对 f(s) 加入 σ(d)μ(sd) 的贡献。而进行整除分块是需要查询区间 f(x) 和,于是采用树状数组维护 f(x) 前缀和。时间复杂度 O(nlog2n+q√nlogn)。
代码:Here
4.设 f(n)=∑d|n[√d∈N+]
求k th number of {x|f(x)=0}
Link
即求min{x|x∑i=1μ2(i)=k}
这个东西已经可以杜教筛了,但是我们讨论莫比乌斯反演。
可以二分答案,问题转为求 [1,n] 内不含非 1 完全平方数因子的数的个数。
考虑去掉所有质数的完全平方数的倍数,但是此时会有重复计算的,如 36 被筛了三次。
所以需要容斥,我们发现只需容斥至 ⌊√n⌋ 即可。
x∑i=1μ2(i)
按照定义可以看为
全体数 − 为一个质因数的平方数的倍数的数的个数 + 为两个不同质因数乘积的平方数的倍数的数的个数 − 三个不同质数乘积的平方数的倍数的数的个数。
即可转化为⌊√n⌋∑i=1μ(i)⌊ni2⌋
时间复杂度 O(T√nlogn)。
5.求n∑i=1m∑j=1lcm(i,j)
Link
假设 n≤m
n∑i=1m∑j=1ijgcd(i,j)n∑i=1m∑j=1∑dijd[gcd(i,j)=d]n∑d=1d⌊nd⌋∑i=1⌊md⌋∑j=1ij[gcd(i,j)=1]
记 f(n,m)=n∑i=1m∑j=1ij[gcd(i,j)=1],g(n,m)=n∑i=1m∑j=1ij=n(n+1)2m(m+1)2
引理 f(n,m)=n∑d=1μ(d)⋅d2⋅g(⌊nd⌋,⌊md⌋)
f(n,m)=n∑d=1n∑d|im∑d|jμ(d)⋅ij
记 s=d⋅i,t=d⋅j
f(n,m)=n∑d=1μ(d)⋅d2⌊nd⌋∑s=1⌊md⌋∑t=1ij=n∑d=1μ(d)⋅d2⌊nd⌋(⌊nd⌋+1)2⋅⌊md⌋(⌊md⌋+1)2
即可前缀和搞定。
回到原式,
n∑d=1d⋅f(⌊nd⌋,⌊md⌋)
时间复杂度 O(n)=O(√n)×O(√n)。
代码:Here
另解:n∑d=1d⌊nd⌋∑i=1⌊md⌋∑j=1ij[gcd(i,j)=1]n∑d=1d⌊nd⌋∑i=1⌊md⌋∑j=1ij∑q|gcd(i,j)μ(q)n∑d=1d⌊nd⌋∑q=1q2μ(q)⋅g(⌊ndq⌋,⌊mdq⌋)
令 s=dq
n∑s=1g(⌊ns⌋,⌊ms⌋)∑dq=sdq2μ(q)n∑s=1g(⌊ns⌋,⌊ms⌋)⋅s∑q|sqμ(q)
右边那堆可以线性筛预处理。
于是现在询问的复杂度将至 O(√n),可以出成多组数据,时间复杂度 O(n+T√n)。
代码:Here
6.给 a1,2,...,n,求n∑i=1n∑j=1lcm(ai,aj)
Link
记 ci=n∑k=1[ak=i],v=nmaxk=1(ak)
v∑i=1v∑j=1lcm(i,j)⋅cicjv∑i=1v∑j=1ijcicjgcd(i,j)v∑i=1v∑j=1∑dijcicjd[gcd(i,j)=d]v∑d=1d⌊vd⌋∑i=1⌊vd⌋∑j=1ijcicj[gcd(i,j)=1]v∑d=1d⌊vd⌋∑i=1⌊vd⌋∑j=1ijcicj∑q|gcd(i,j)μ(q)v∑d=1d⌊vd⌋∑q=1q2μ(q)⌊vdq⌋∑i=1⌊vdq⌋∑j=1ijcicj
令 s=dq
v∑s=1(⌊vs⌋∑i=1cis⋅i)2⋅s∑q|sqμ(q)
筛一下就能 O(vlnv) 了。
7.设 f(x) 为 n 所含质因子的最大幂指数,求n∑i=1m∑j=1f(gcd(i,j))
Link
设 n≤m
n∑d=1f(d)⌊nd⌋∑i=1⌊md⌋∑j=1[gcd(i,j)=1]n∑d=1f(d)⌊nd⌋∑q=1μ(q)⌊ndq⌋⌊mdq⌋
令 s=dq
n∑s=1⌊ns⌋⌊ms⌋∑d|sf(d)μ(sd)
写出 s 的标准分解式 s=k∏i=1pqii,因为 μ 不为 0 当且仅当所有质因子指数为 1,所以只有 2k 个对应的 d。如果确定最高次幂 pqx−1x,剩余的位都能选或不选,此时的 μ 也相对应地都为 1,−1,f(d) 也均相等,和为 0。
若全部次幂完全相同,即 s=k∏i=1pqi,则 d=k∏i=1pq−1i 时 f(d)=q−1,其余时候 f(d)=q。
由于有一情况 f(d)=q−1,其贡献为 −1×μ(k∏i=1pi)=−1n+1.
时间复杂度 O(n+T√n)。
代码:Here
注意:以下题目的难度顺序可能不递增
8.求n∏i=1n∏j=1lcm(i,j)gcd(i,j)
Linkn∏i=1n∏j=1ijgcd(i,j)2∏ni=1∏nj=1ij∏ni=1∏nj=1gcd(i,j)2
考虑分开做,分子n∏i=1n∏j=1ijn∏i=1inn!(n!)2n
分母n∏i=1n∏j=1gcd(i,j)2n∏d=1d2∑ni=1∑nj=1[gcd(i,j)=d]n∏d=1d2∑⌊nd⌋q=1μ(q)⌊ndq⌋2
然后就可以整除分块了,时间复杂度 O(n)。
代码:Here
9.求n∑i=1m∑j=1d(ij)
Link
引理 d(ij)=∑x|i∑y|j[gcd(x,y)=1]
留坑。n∑i=1m∑j=1∑x|i∑y|j[gcd(x,y)=1]n∑x=1m∑y=1⌊nx⌋⌊my⌋[gcd(x,y)=1]
改写 x,y 为 i,j
n∑i=1m∑j=1⌊ni⌋⌊mj⌋[gcd(i,j)=1]
设f(x)=n∑i=1m∑j=1⌊ni⌋⌊mj⌋[gcd(i,j)=x]g(x)=n∑x|df(d)=n∑i=1m∑j=1⌊ni⌋⌊mj⌋[x|gcd(i,j)]=⌊nx⌋∑i=1⌊mx⌋∑j=1⌊nix⌋⌊mjx⌋
根据莫比乌斯反演公式,有f(x)=n∑x|dμ(d)g(dx)f(1)=n∑d=1μ(d)g(d)g(x) 可以通过预处理 q∑i=1⌊qi⌋O(1) 得出。时间复杂度 O(n√n+T√n)。
代码:Here
另解:
此下令 n=m
n∑i=1n∑j=1∑x|i∑y|j[gcd(x,y)=1]n∑d=1⌊nd⌋∑i=1⌊nd⌋∑j=1⌊nid⌋∑p=1⌊njd⌋∑q=1[gcd(x,y)=1]n∑d=1μ(d)(⌊nd⌋∑i=1⌊nid⌋)2
使用杜教筛,求 μ 的前缀和可以做到 O(n23+n34) 的时间复杂度。
代码:Here
10.求n∑i=1ik[gcd(i,n)=1]
其中n=w∏i=1pqii
Link
设f(n)=n∑i=1ikg(n)=n∑i=1ik[gcd(i,n)=1]f(n)=∑d|ndkg(nd)
由莫比乌斯反演公式得g(n)=∑d|nμ(d)dkf(nd)
众所周知,自然数幂和 f(n) 是关于 n 的 k+1 次多项式,写成 f(n)=k+1∑i=0fini,代回得g(n)=∑d|nμ(d)dkk+1∑i=0fi(nd)ig(n)=k+1∑i=0fini∑d|nμ(d)dk−i
因为 n=w∏i=1pqii,代入得g(n)=k+1∑i=0finiw∏j=1qj∑q=1μ(pqj)pq(k−i)j
从 μ 的意义入手化简得g(n)=k+1∑i=0finiw∏j=1(1−pk−ij)
现在只需求自然数 k 次幂和的多项式即可,这个可以看 Here,这里不讲.
时间复杂度可以做到 O(k2+kw) 或者 O(k3+kw)。
代码:Here
Next
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现