二维积性函数——zky 数论选讲学习笔记
线性筛
埃氏筛:从小到大扫,遇到一个质数就将其所有倍数标记为合数。可以证明时间复杂度是 O(nloglogn) 的。
对于一个合数,考虑在其最小质因子 p 处筛掉他。设这个合数是 x×p,先枚举 x,然后再从小到大枚举 p,并标记 xp 为合数。如果枚举的过程中发现 xmodp=0,那么当 p 更大时 p 就不是 xp 的最小质因子了,终止循环。
每个合数只会被筛一次,所以时间复杂度 O(n)。该筛法还可以直接用于筛 f(i)=in 等积性函数。适用范围广,但复杂度也大。
数论函数和积性函数
定义:数论函数是定义域为正整数集,陪域为复数域的函数。
把它看成是一个只在整数处有值的函数就行了。
对于一个数论函数 f,约定 Sf(n)=∑ni=1f(i)
定义:积性函数是指一个定义域为正整数 n 的数论函数 f(n),且满足如下性质:f(1)=1,且当 a 和 b 互质时,f(ab)=f(a)f(b)
对于一个积性函数 f,只要知道了对于所有 f(pk)(p 是质数,k 是正整数),我们就可以知道整个 f 函数。
一般来说,我们说明一个数论函数是积性函数,只需要说明对于任意
x=∏ipαii,都有 f(x)=∏if(pαii) 即可。
Dirichlet 卷积
对于数论函数 f 和 g,定义其 Dirichlet 卷积:
(f∗g)(x)=∑d|xf(d)g(xd)
如果将 Dirichlet 卷积视为数论函数的乘法,函数的直接加和为数论函数的加法。那么数论函数的加法和乘法是满足交换律、结合律和分配律的。
定理:对于积性函数 A, B,C=A∗B 也是积性函数。
也可以定义 Dirichlet 除法 A/B=C 使得 B∗C=A。只要
B(1)≠1,就能逐位确定 C。此时 C 存在且唯一。
定理:如果 A 和 B 都是积性函数,那么 C 一定也是积性函数。
Dirichlet 前缀和
给定数组 a,求数组 b 满足 bx=∑y|xay。
我们可以将问题看成是,对于一个数论函数 A,我们要求出 A∗I 的前 n 项。
因为 I 是一个积性函数,所以将其看成是积性函数的乘积。
设 fi(pk)=[p=pi](pi 是从小到大第 i 个质数)。那么 I=∏fi。所以 A∗I=A∗f1∗f2∗...,即每次乘一个 fi。注意到乘单个 fi 是可以 O(npi) 完成的。所以总时间复杂度就变成了 O(nloglogn)。
普通数论函数卷普通积性函数也可以类似地做到 O(nloglogn)。
该算法的“转置算法”求 bx=∑x|yay 也可以在相同复杂度内完成。
整除分块
计算 ∑ni=1d(i)。
答案为 ∑ni=1=∑xy=i1=∑xy≤n1=∑nx=1⌊nx⌋
注意到 ⌊nx⌋ 实际上只有 O(√n) 段,所以考虑一些基于此的暴力。
从 l=1 开始。设 v=⌊nk⌋。每次找出满足 ⌊nr⌋=v 的最大的 r,然后 [l,r] 这一段元素就可以被跳过,新的 l′=r+1 继续做。
这个 r 就是满足 nr≥v 的最大的 r,即 ⌊nv⌋。所以这个问题容易 O(√n) 解决。
例题
给定序列 A,B,C,求 ∑ni=1∑nj=1A(i)B(j)C(gcd(i,j))。
n≤106
传统做法是莫比乌斯反演,考虑使用积性函数性质解决。
设计函数 D 满足 C=D×I,即 Ci=∑Djj|i。
那么答案等于 ∑ni=1A(i)∑nj=1B(j)∑d|i,d|jD(d)
交换求和顺序,答案即为 ∑dD(d)(∑d|iA(i))(∑d|iB(i))
Powerful Number
定义:称一个正整数 m 是 PowerfulNumber,当且仅当对于任意 m 的质因数 p,均有 p2|m
定理:对于所有 PN,我们都可以将其表示成 a2b3 的形式(其中 a 和 b 都是正整数)。
定理:n 以内的 PN 个数为 O(√n)
对于 70pts 部分分:给定一个积性函数 S,求 ∑ni=1∑nj=1S(ij),n≤3×107
为了解决上面的问题,需要把积性函数推广到二维。
首先二维数论函数 g(x,y) 还是没什么性质的普通函数。
称二维数论函数 f(x,y) 是二维积性函数,当且仅当 ∀a,b,c,d 使得 gcd(ab,cd)=1,都有 f(ac,bd)=f(a,b)f(c,d)。
上面这个定义还是有点太抽象了(这是按照一维积性函数的定义改的)。实际上可以更简单地理解这件事情。假设 pi 是从小到大第 i 个质数 x=∏ip\aii,y=∏ipbii,那么 f(x,y)=∏if(paii,pbii)
容易发现,要求的是一个二维积性函数 f(x,y)=S(xy) 的二维前缀和
类似地,定义二维 Dirichlet 卷积。设 a,b 的 Dirichlet 卷积为 c,那么:
c(x,y)=∑u|x,v|ya(u,v)b(x/u,y/v)
类似一维地,c(1,1)≠0 的数论函数存在逆元;两个二维积性函数的 Dirichlet 卷积和 Dirichlet 除法都是二维积性函数
类似 PowerfulNumber 地,考虑用 PowerfulNumber 的思想来解决问题。
考虑设计积性函数 g(x,y) 满足 g(pa,pb)=f(pa,1)f(1,pb)。对于这个函数,其前缀和 ∑i≤n1∑j≤n2f(ij) 是相当容易计算的。
观察 h=f/g。对于单个 p 来说,发现这个 Dirichlet 除法相当于是二维多项式的除法。
发现 h(pk,1)=h(1,pk)=0
n∑i=1n∑j=1f(i,j)=∑u,vh(u,v)(∑iu≤n,jv≤ng(i,j))
复杂度 O(n)
(时间复杂度的证明没看懂,所以留着吧,反正 O(n) 肯定能解决。)
直接套用上文的做法,发现 h(x,y) 只在 x=y 处有值且值为 µ(x)。所以答案为 ∑ni=1µ(i)(∑⌊n/i⌋j=1d(j))(∑⌊m/i⌋k=1d(k)),整除分块解决,复杂度 O(N+T√N)
submission
把做法拓展到三维,可以得到 h(pa,pb,pc) 只在 a,b,c 形成的可重集是 {0,0,0},{0,1,1},{1,1,1} 处有值。直接搜有值位置的复杂度就是 O(n√n)。
submission
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步