【随笔浅谈】积性函数的各种处理

 


1:整除

1.1:整除的性质 1

对于 a,b,cZ,有:

abc=abc

证明

ab=ab+r,其中 0r<1,则:

abc=ab1c=1c(ab+r)=abc+rc=abc

Q.E.D

1.2:整除的性质 2

给出一个正整数 n,对于正整数 d(1dn)nd 的取值不超过 2n 种。

证明

可以分类讨论:

  • dn,因为 d 的取值不超过 n 种,显然 nd 的取值不超过 n 种。
  • d>n,则 ndn,故 nd 的取值不超过 n 种。

综上所述,nd 的取值不超过 2n 种,Q.E.D

1.3:整除分块

给出一个正整数 n,请你求出:

i=1nni

其中 1n109

分析

观察到函数 f(x)=nx 在区间 (0,+) 上单调递减。

所以,对于函数 g(x)=nx 的任意一个函数值,令 g(x) 取到该值的所有自变量 x 组成一段连续的区间。

根据「1.2:引理 2」,我们知道这样的区间个数也是 O(n) 级别的。

对于一段满足 g(x) 均相等的区间,我们可以直接得出该区间里的所有 x 对答案的贡献。那现在的关键在于如何得到这些区间。

考虑任意一个 i(1in),我们现在要找到一个最大的 j(ijn),使得 ni=nj。结论:j=nni

证明

  1. 第一步,证明其合法性(ijn)。

nininninni=iinni=j

  1. 第二步,证明其为最大值。

考虑任意一个满足 ni=njj

ni=njninj<ni+11ni+1<jn1ninni+1<jnni

因为 jZ,故 jmax=nni

Q.E.D

实现

根据上述结论,我们就有了找出这 O(n) 个区间的方法。直接套结论做即可,时间复杂度是 O(n) 的。

1.4:多维整除分块

给出两个正整数 n,m,请你求出:

i=1min(n,m)nimi

其中 1n,m109

分析

上式的乘积项包含两个取整分式。

考虑任意一个 i,我们现在要找到一个最大的 j,使得 ni=njmi=mj。易证:j=min{nni,mmi}

扩展到多维也是一样的道理。

2:积性函数

2.1:积性函数的定义

若数论函数 f(n) 满足:对于任意互质正整数 x,y,都有 f(xy)=f(x)f(y)。则 f(n)积性函数

若数论函数 f(n) 满足:对于任意正整数 x,y,都有 f(xy)=f(x)f(y)。则 f(n)完全积性函数

2.2:积性函数的简单性质

  • 对于任意积性函数 f(x),都有 f(1)=1
  • 对于任意积性函数 f(x),g(x),则以下的 h(x) 也均为积性函数:

h(x)=f(xp)h(x)=fp(x)h(x)=f(x)g(x)h(x)=d|xf(d)g(xd)

  • x 分解质因数,若 f(x) 为积性函数,则 f(x)=i=1mf(pici)

2.3:常见积性函数

  • 单位函数(完全积性):

ϵ(n)=[n=1]

  • 恒等函数(完全积性):

IDk(n)=nk

  • 常数函数(完全积性):

1(n)=1

  • 约数函数(积性):

σk(n)=d|ndk

  • 欧拉函数(积性):

φ(n)=ni=1m(11pi)

  • 莫比乌斯函数(积性):

μ(n)={0i[1,m],ci>11m0(mod2),i[1,m],ci=11m1(mod2),i[1,m],ci=1

3:Dirichlet 卷积

3.1:Dirichlet 卷积的定义

定义两个数论函数 f,g 的 Dirichlet 卷积为:

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

3.2:Dirichlet 卷积的性质

  • 交换律:fg=gf
  • 结合律:(fg)h=f(gh)
  • 分配律:f(g+h)=fg+fh
  • 单位元:fϵ=f,因此 ϵ 也被叫做 Dirichlet 卷积单位元。

3.3:常见 Dirichlet 卷积式

3.3.1:式 1

ϵ=μ1d|nμ(d)=ϵ(n)

证明

不难看出关于 n 的函数 f(n)=dnμ(d) 是个积性函数。

  • n=1 时,显然有 f(1)=1

  • n>1 时,将 n 质因数分解,得:

f(n)=i=1mf(pici)=i=1m(d|piciμ(d))=i=1m(j=0ciμ(pij))=i=1m(μ(1)+μ(pi))=0

综上所述,f(n)=d|nμ(d)=[n=1],Q.E.D

3.3.2:式 2

ID=φ1d|nφ(d)=n

证明

不难看出关于 n 的函数 f(n)=d|nφ(d) 是个积性函数。

  • n=1 时,显然有 f(1)=1
  • n>1 时,将 n 质因数分解,得:

f(n)=i=1mf(pici)=i=1m(d|piciφ(d))=i=1m(j=0ciφ(pij))=i=1m(1+j=1ciφ(pij))=i=1m(1+j=1ci(pijpij1))=i=1mpici=n

综上所述,f(n)=d|nφ(d)=n,Q.E.D

3.3.3:式 3

φ=μIDφ(n)=d|ndμ(nd)

证明

φ1=IDφ1μ=μIDφϵ=μIDφ=μID

Q.E.D

4:线性筛

线性筛,也叫 Euler 筛。可以在线性时间内筛出 1n 里的所有质数。相信大家都会。

4.1:线性筛筛积性函数

线性筛可以在线性时间内筛出大部分积性函数的前 n 项的函数值。

一般地,对于积性函数 f(x),若 f(pc) 的值便于分析。则该函数的前 n 项的函数值可以被线性筛筛出来。

我们要多维护一个数组 lowi 表示:若 i 的最小质因子为 p1,其次数为 c1,则 lowi=p1c1

在线性筛的过程中,有特殊的两点:

  • 若当前遇到了一个质数 p,则将 f(p),f(p2),f(p3),,f(pc) 都计算出来。
  • 在计算至少包含两个质因子的 i 对应的函数值时,由积性函数定义得 f(i)=f(ilowi)f(lowi)

这样就可以在线性时间内筛出一个积性函数的前 n 项了。对于一些简单的积性函数(例如 φ,μ)就有更简单的筛法,不一定需要维护 lowi

4.1.1:线性筛筛欧拉函数

  • p 为质数,若 pnp2n,则 φ(n)=φ(np)p
  • p 为质数,若 pnp2n,则 φ(n)=φ(np)(p1)

4.1.2:线性筛筛莫比乌斯函数

  • p 为质数,若 pnp2n,则 μ(n)=0
  • p 为质数,若 pnp2n,则 μ(n)=μ(np)

4.1.3:线性筛筛各种积性函数

根据积性函数的特殊性质。利用 lowi 数组。可以在线性时间内筛出大部分积性函数的前 n 项的函数值。

请读者好好品味这段代码。

4.2:例题选讲

4.2.1:【日常训练】挺好序列

Description

定义一个长度为 n 的挺好序列 a1,a2,,an,满足:对于 i[1,n],都有 ai|A
定义一个长度为 n 的挺好序列 a1,a2,,an 的价值为 gcd(a1,a2,,an,B),其中 B 为定值。

给出三个正整数 n,m,B。定义 f(x)A=x 时所有挺好序列的价值和。请你求出:

i=1mf(i)

答案对 998244353 取模。

数据范围:1n10181m2×1071B1018
时空限制:3000 ms/512 MiB

Solution

结论

f(x) 是积性函数。

证明

考虑任意互质的正整数对 x,y

设序列 a1,a2,,anA=x 时的某个挺好序列,设序列 b1,b2,,bnA=y 时的某个挺好序列。

考虑生成序列 c1,c2,,cn,其中 ci=aibi,显然该序列是 A=xy 时的某个挺好序列。

关注序列 c 的价值。因为 x,y 互质,所以 ai,bi 也一定互质。在唯一分解角度下观察,显然有:

gcd(a1,a2,,an,B)gcd(b1,b2,,bn,B)=gcd(c1,c2,,cn,B)

故序列 c 的价值为序列 a,b 的价值之积。

回到积性函数的讨论上。f(x)f(y) 的每一项,相当于是从 f(x)f(y) 各选一项的乘积。故 f(x)f(y)A=xy 时所有挺好序列的价值和。

所以 f(xy)=f(x)f(y),所以 f(x) 为积性函数。

Q.E.D


注意到 1m2×107,可以考虑线性筛。按照上文「4.1.3:线性筛筛积性函数」的内容。现在要对于任意一个质数 p,如何求出 f(pc)

对于一个质数 p,令 d 为满足 pxB 的最大的 x。可以简单分类讨论一下,不难得出:

  • cd 时:

f(pc)=i=0cpi[(ci+1)n(ci)n]

  • c>d 时:

f(pc)=pd(cd+1)n+i=0d1pi[(ci+1)n(ci)n]

求出 f(p),f(p2),,f(pc) 后,灵活运用线性筛即可求出 f(x) 的前 m 项,那么 i=1mf(i) 就直接算即可。

5:莫比乌斯反演

已知两个数论函数 f,g 满足:

f(n)=dng(d)

则:

g(n)=dnf(d)μ(nd)

证明

已知条件等价于:

f=g1

两边同卷 μ 可得:

gϵ=fμg=fμ

QED。

5.1:例题选讲

5.1.1:经典问题

Description

给出一个正整数 n,求有多少个长度为 n,循环节长度也恰好为 n 的小写字符串。

数据范围:1n109

Solution

设长度为 n 的小写字符串有 f(n) 个;设长度为 n,循环节长度也恰好为 n 的小写字符串有 g(n) 个。

显然有:

f(n)=26n

以及:

f(n)=dng(n)

根据莫比乌斯反演,可得:

g(n)=d|n26dμ(nd)

5.1.2:【Luogu P2522】「HAOI2011」Problem b

Luogu P2522

Description

给出五个正整数 a,b,c,d,k,请你求出:

aibcjd[gcd(i,j)=k]

T 组询问。

数据范围:1T,k5×1041ab5×1041cd5×104
时空限制:2500 ms/250 MiB

Solution

calc(n,m) 为:

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

简单容斥可得,答案为:

calc(b,d)calc(a1,d)calc(b,c1)+calc(a1,c1)

考虑这样一个 calc(n,m) 要怎么求,注意到 gcd(i,j)=kgcd(ik,jk)=1 是等价的,故原式化为:

i=1nkj=1mk[gcd(i,j)=1]i=1nkj=1mkϵ(gcd(i,j))

利用 ϵ=μ1 反演,得:

i=1nkj=1mkdgcd(i,j)μ(d)

交换枚举顺序,考虑先枚举 d。要使得 dgcd(i,j),只需要让 didj 即可,故答案化为:

d=1min(nk,mk)μ(d)nkdmkd

上式就比较好处理了。线性筛筛出莫比乌斯函数,求一遍莫比乌斯函数的前缀和,然后直接上数论分块。

实现上,可以先令 nnk,mmk,这样就比较好做了。

时间复杂度 O(N+TN),其中 N 表示输入数据上界。

5.1.3:【Luogu P1829】「国家集训队」Crash 的数字表格

Luogu P1829

Description

给出两个正整数 n,m,请你求出:

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

答案对 20101009 取模。

数据范围:1n,m107
时空限制:2000 ms/500 MiB

Solution

不难发现原式为:

i=1nj=1mi×jgcd(i,j)

d=gcd(i,j),考虑交换枚举顺序:

d=1min(n,m)1ddindjm[gcd(i,j)=d] i×j

ij 中的 d 提取出来,得:

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

记:

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

考虑化简 F(n,m)

F(n,m)=i=1nj=1mi×j×pgcd(i,j)μ(p)=p=1min(n,m)μ(p)p2i=1npj=1mpi×j

记:

g(n,m)=i=1nj=1mij=i=1nij=1mj=n(n+1)2m(m+1)2

则:

F(n,m)=p=1min(n,m)μ(p)p2g(np,mp)

可以线性筛一下,然后数论分块。当 n,m 同阶时,计算 F(n,m)O(n) 的。

回到本题,可得答案为:

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

然后这个式子也可以数论分块做,本质上是一个数论分块套数论分块。

线性筛的复杂度是 Θ(n) 的。数论分块套数论分块的复杂度是 O(n34)

于是这题就这样做完了。

关于「数论分块套数论分块」复杂度的证明

原问题中最后计算答案的式子是一个二维数论分块套二维数论分块,看起来不太爽。我们把它替换成一个一维数论分块套一维数论分块,大概是这样:

d=1ndF(nd)

其中,计算 F(n) 的复杂度是 O(n) 的。考虑证明上式的复杂度。

可以分类讨论一下:

  • dn 时,最劣的情况是每一个 nd 互不相同,故此部分对复杂度的贡献为:

i=1nO(ni)

  • d>n 时,注意到 nd 的值会均会落在区间 [1,n] 中,最劣的情况是 nd 的值将 [1,n] 里的所有数都取过一遍,故此部分对复杂度的贡献为:

i=1nO(i)

简单积分近似一下:

i=1nO(i)+i=1nO(ni)O(0n12[x12+(nx)12]dx)

根据微积分基本定理,设 H(x)=23x32+n122x12,有 H(x)=x12+(nx)12。则:

0n12[x12+(nx)12]dx=H(n12)H(0)=83n34

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

5.1.4:【Luogu P2257】YY 的 GCD

Luogu P2257

Description

给出两个正整数 n,m,请你求出满足 1in1jm 的所有数对 (i,j) 中,满足 gcd(i,j) 为质数的数对有多少个。

Q 组数据。

数据范围:1Q1041n,m108
时空限制:4000 ms/500 MiB

Solution

为了方便叙述,设质数集为 P

注意到答案为:

pPi=1nj=1m[gcd(i,j)=p]pPi=1npj=1mp[gcd(i,j)=1]pPi=1npj=1mpdgcd(i,j)μ(d)pPd=1min(np,mp)μ(d)npdmpd

考虑继续化简,令 T=pd,则上式化为:

pPd=1min(np,mp)μ(d)nTmTT=1min(n,m)nTmTp|T,pPμ(Tp)

H(n)=p|n,pPμ(np),则原式化为:

T=1min(n,m)H(T)nTmT

考虑预处理出 H(n)。可以使用 " 倍数法 ",对于每个质数 p,让其去贡献它的每一个倍数 T,稍微卡卡常也可以过。更高明的做法是挖掘 H(n) 的一些性质,然后使用线性筛将 H(n) 筛出来,这里直接给出结论:

H(n)={1nPH(np)+μ(np)pn,p2nμ(np)pn,p2n

预处理出 H(n) 后再处理出它的前缀和。这样就可以配合数论分块求出答案的值了。

时间复杂度 O(n+Qn)

5.1.5:【LOJ #6627】「XXOI 2019」等比数列三角形

LOJ #6627

Description

给出一个正整数 n。请你求出:有多少个合法的三角形,满足三边都是 n 的整数,且三边成等比数列。

数据范围:1n1012
时空限制:1000 ms/256 MiB

Solution

枚举公差,将公差表示成一个既约分数 k=pq1 的形式,也就是说我们要保证 gcd(p,q)=1

对于任意的一个三角形,不妨设三边中的最短边为 x,则三边为 x,kx,k2x

考虑公差 k=pq 有一些什么限制:

  • 需要满足三角形的 " 两边之和大于第三边 ",即:

x+kx>k2x1k<1+52

e=1+52,根据上面的两条限制,不难得出 q 关于 p 的取值范围:

peqp

  • 需要满足三角形的三边都是整数,即:

p2q2xZq2x

由于 q2x,可设 i=xq2,则答案为:

ppeqp[gcd(p,q)=1]i=1[p2in]p=1nnp2peqp[gcd(p,q)=1]

S(n,p)=i=1n[gcd(i,p)=1],考虑化简该函数:

S(n,p)=i=1ndgcd(i,p)μ(d)=dpμ(d)nd

回到问题中,答案化为:

p=1nnp2[S(p,p)S(pe1,p)]

使用 " 倍数法 ",计算出函数 g(p)=S(p,p)S(pe1,p),然后直接算即可。

时间复杂度 O(nlogn)

6:杜教筛

有时候,我们需要快速地对一些数论函数求前缀和,甚至是需要在低于线性时间的复杂度内求解。这时可以利用杜教筛来求出这些前缀和。

一般地,给出一个数论函数 f(x),你需要求出 S(n)=i=1nf(i)

注意到,对于任意一个数论函数 g,必定会满足:

i=1n(fg)(i)=i=1ndig(d)f(id)=i=1nj=1nig(i)f(j)=i=1ng(i)j=1nif(j)=i=1ng(i)S(ni)

故有:

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

此时我们得到了一个 S(n) 关于 S(ni) 的递推式。若 fgg 的前缀和都较好处理的话,就可以考虑使用数论分块来处理上面的递推式,较短时间内求出 S(n),因此找到一个合适的数论函数 g 是关键。

如果直接使用数论分块做上面的递推式,根据 nd 的取值进行分段。 不考虑递归的情况下,单纯去处理一个 S(n) 的复杂度是 O(n) 的,递归下去的复杂度为低阶小量 o(n),故计算 S(n) 的复杂度为:

O(n)+i=1nO(i)+i=1nO(ni)

简单积分近似一下:

i=1nO(i)+i=1nO(ni)O(0n12[x12+(nx)12]dx)=O(n34)

可以积分近似证明,先线性筛预处理出 f(x) 的前 n23 项,可以取得杜教筛的理论最优复杂度 O(n23)

对于一些较大的 n,需要使用 std::map 来存下对应的值(记忆化),方便以后使用时直接计算出结果。

6.1:例题选讲

6.1.1:【Luogu P4213】Sum

Luogu P4213

Description

给出一个正整数 n,请你求出:

ans1=i=1nφ(i)ans2=i=1nμ(i)

数据范围:1n<231
时空限制:2000 ms/512 MiB

Solution

莫比乌斯函数前缀和

注意到 μ1=ϵ,则考虑使用常数函数 1(n)=1 来构造递推式:

S(n)=1i=2nS(ni)

然后直接筛即可。

欧拉函数前缀和

注意到 φ1=ID,则考虑使用常数函数 1(n)=1 来构造递推式:

S(n)=n(n+1)2i=2nS(ni)

然后直接筛即可,但其实更好的做法是莫比乌斯反演。

6.1.2:【Luogu P3768】简单的数学题

Luogu P3768

Description

给出一个正整数 n,请你求出:

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

答案对给定的质数 p 取模。

数据范围:1n10105×108p1.1×109
时空限制:4000 ms/256 MiB

Solution

利用 φ1=ID 反演,得:

i=1nj=1nijdgcd(i,j)φ(d)d=1nφ(d)didjijd=1nφ(d)d2i=1ndj=1ndij

F(n)=i=1ni=n(n+1)2,则答案化为:

d=1nφ(d)d2F2(nd)

考虑使用数论分块处理上式,现在的问题是要求出函数 H(n)=φ(n)n2 的前缀和,考虑杜教筛。

线性筛的部分相信大家都会,主要是讨论构造 S(n)=i=1nH(i) 关于 S(ni) 递推式的部分。

注意到恒等函数 ID2,考虑将 HID2 卷在一起:

(HID2)(n)=dnφ(d)d2(nd)2=dnφ(d)n2=n2d|nφ(d)=n3

于是可以得到 HID2=ID3,我们发现 ID2ID3 的前缀和都可以直接 Θ(1) 计算(实在记不清楚公式的话,直接上拉格朗日插值吧),于是我们就可以得到 S(n) 的递推式:

S(n)=(n(n+1)2)2i=2ni2S(ni)

直接上数论分块即可。

6.1.3:【BZOJ #4804】欧拉心算(加强版)

Description

给出两个正整数 n,m,请你求出:

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

数据范围:1n,m109
时空限制:1500 ms/512 MiB

Solution

i=1nj=1mφ(gcd(i,j))=d=1φ(d)i=1nj=1m[gcd(i,j)=d]=d=1φ(d)i=1ndj=1md[gcd(i,j)=1]=d=1φ(d)i=1ndj=1mdpgcd(i,j)μ(p)=d=1φ(d)p=1μ(p)npdmpd

T=pd,则式子化简为:

T=1min(n,m)nTmT(dTφ(d)μ(Td))

g=φμ(这里的 是狄利克雷卷积,下文同),则式子化简为:

T=1min(n,m)nTmTg(T)

可以用数论分块处理上式,现在的问题是要求 g 的前缀和。可以考虑杜教筛,设:

S(n)=i=1ng(i)

d=11,其中函数 1(n)=1,显然函数 d 为约数个数函数。

那么可以得到 S(n) 有关 S(nd) 的递推式:

d(1)S(n)=i=1n(gd)(i)i=2nd(i)S(ni)

化简:

d(1)S(n)=i=1n((φ1)(μ1))(i)i=2nd(i)S(ni)d(1)S(n)=n(n+1)2i=2nd(i)S(ni)

约数个数函数前缀和 i=1hd(i) 即为 i=1hhi。直接用数论分块求解,复杂度较大。运用类似杜教筛的方法处理,具体地:

  • 对于 xn23 的部分:运用线性筛求解每个 S(x),i=1xd(i)
  • 对于 x>n23 的部分:运用数论分块求解 i=1xd(i),运用递推式求解 S(x)

可以证明两部分的复杂度均为 O(n23),直接上数论分块即可。

posted @   Calculatelove  阅读(506)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
点击右上角即可分享
微信分享提示