Typesetting math: 0%

数论基础 学习笔记

观前提醒:博主是民科

RT,梳理一下这方面的理论。写到的并不代表我以前不会。

Part 1

线性丢番图方程、线性同余方程

草 真就从头学起了呗

u1s1 为啥线代和数论都是从解方程开始的啊/yiw

丢番图方程是一切(系数、解)在整数范围内进行的关于多个变量的多项式方程。线性丢番图方程就是次数必须为 11 的丢番图方程。我们先考虑解二元线性丢番图方程 ax+by=c,这个是 exgcd 算法。

显然 LHS 一定是 gcd(a,b) 的倍数。如果 gcd(a,b)c,那么显然无解。否则结论是一定有(无限组)解,我们求 ax+by=gcd(a,b) 的一组特解,然后扩大 cgcd(a,b) 倍,然后不用脑子地表示成通解形式。

考虑辗转相除法的过程,归纳求解(边界是 b=0,此时有解 x=1,y=0(u1s1 y 可以取任意整数))。假设现在已经得到 bx+(amodb)y=gcd(b,amodb) 的一组特解 x=x0,y=y0。该方程和原方程的 RHS 显然相等,我们只要构造一组 x,y 使它们的 LHS 相等即可,即 ax+by=bx0+(amodb)y0。RHS 展开得到 ax+by=bx0+ay0baby0,即 a(xy0)=b(x0aby0y)。令两边等于 0,解得 x=y0,y=x0aby0。时间复杂度是对数级别。

然后扩大 cgcd(a,b) 倍得到 ax+by=c 的一组特解 x=x0,y=y0,那么通解就是 x=x0+bgcd(a,b)k,y=y0agcd(a,b)k(kZ)模板题 代码

多元线性丢番图方程 -> 二元线性丢番图方程

考虑多元线性丢番图方程 ni=1aixi=b。把 i=1 提出来,把 2n 当作一个整体,这样后者显然是 d=ngcdi=2ai 的倍数。于是我们解二元线性丢番图方程 a1x1+dy=b 的任意一组特解 x1=x0,y=y0,然后解规模降一的线性丢番图方程 ni=2aixi=dy0(根据归纳,若之前的二元者有解,则该方程一定有解)。这样就可以得到 x1n 的一组特解,不难得到有解的充要条件是 ngcdi=1aib

通解就没那么好表示了,大概就是可以任意选两个变量进行二元的增减。

线性同余方程 -> 二元线性丢番图方程

不难发现线性同余方程 axb(modp) 的解集是和二元线性丢番图方程 ax+py=b 的所有解中的 x 值构成的集合相等的。那么搞到模 p 意义下就是 [0,p) 内的所有解。于是该线性同余方程有解当且仅当 gcd(a,p)b,解集是 x=x0+pgcd(a,p)k(kZ)。模 p 意义下有唯一解显然当且仅当 ap

乘法逆元的存在唯一性

一个数是 a 的模 p 意义下的乘法逆元当且仅当 ax1(modp) 在模意义下有唯一解(即 ap)且这个解就是这个数。若 p 是质数,要满足 ap 的话,显然是当且仅当 a0(模意义下)。若 a 有乘法逆元,则 a 的乘法逆元 a1 也必定有乘法逆元,且为 a:因为若否,则 a1p 有大于 1 的公因数,乘以 a 也一定有,而 a1a1(modp),矛盾。

容易发现,模意义下的除法 axb(modp) 有意义(存在唯一解)和 a 存在乘法逆元的充要条件是一样的。于是模意义下的有意义的除法显然是 ba=a1b

对质数 p,根据费马小定理显然有 a1=ap2。对合数 p,根据欧拉定理有 a1=aφ(p)1。对于前者直接快速幂就好了;对于后者,这个单点欧拉函数求起来要分解质因数,有点麻烦,一般直接使用 exgcd 求解 b=1 的线性同余方程,或者对于除法直接用 exgcd 求解一般线性同余方程。

简化剩余系

对一个质数 p,集合 A={xx[0,p),xp} 称为模 p 的简化剩余系。显然有 |A|=φ(p)

性质:对任意 ap,构造 B={axmodpxA},有 A=B

证明:

  1. 显然 BA
  2. 因为 ap,所以 a 有逆元,则对 yA 存在 x=a1yA 满足 ax=y,于是 yB,于是 AB

综上,得证。

欧拉定理、费马小定理、扩展欧拉定理

欧拉定理:对整数 p>1,若 ap,则 aφ(p)1(modp)

证明:考虑模 p 的简化剩余系 A。构造 B={axmodpxA},由简化剩余系的性质得到 A=B。于是有 iAiiBi(modp),即 iAiiAiaφ(p)(modp)。又由于 iAip,所以 aφ(p)1(modp),得证。

pP 带入欧拉定理得到费马小定理:对质数 p,若 pa,则 ap11(modp)

欧拉定理可以将 ap 时的 abc(modp) 转化为等价的 abmodφ(p)c(modp),它将指数降低到 [0,p) 内。但并没有给出 a⊥̸p 时的方法。扩展欧拉定理:不管是否有 ap,只要 bφ(p)(如果不满足,显然指数已经够小了),则有 ababmodφ(p)+φ(p)(modp)

我们来研究一下后面的 +φ(p) 是怎么得来的。考虑将 p 质因数分解:p=pαii,如果知道了 abmodpαii 们,根据 CRT 可知对应 modp 值是唯一的。而如果对所有 i 都有 abc(modpαii),那么可知 c 就是 abc(modp) 的唯一解。于是我们现在要努力构造 c=ad 满足这个条件。设 P=pαii,分是否有 aP 两种情况讨论:

  1. aP,则根据欧拉定理有 ababmodφ(P)(modP)。由 φ 的积性性可知 φ(P)φ(p),于是 bmodφ(p)bmodφ(P)(modφ(P)),所以 ababmodφ(p)+kφ(p)(modP)
  2. a⊥̸P,显然必有 pia。我们知道 φ(P)=pαi1i(pi1),可以证明 φ(P)αi 恒成立(首先这俩玩意根本不是一个量级的,渐进意义上显然是大于,至于数值验证你可以取 pi=2 代入 geogebra 发现在整点处都满足),此时有 bφ(p)φ(P)αi。根据 bαi 可知 ab0(modP),而我们需要构造 c=ad 其中 dαi 即可,dφ(p) 这个常量是个很好的选择。

综上,如果只有第一类,那么就满足欧拉定理的条件,直接选 k=0 即可。否则发现 k=0d=bmodφ(p) 不满足 dφ(p),为了追求 d 尽量小,我们取 k=1 即可。

ExCRT

我们考虑求与由两个方程构成的线性同余方程组 {xa1(modp1)xa2(modp2) 等价的线性同余方程 xa(modp) 中的 ap。两个方程的解集分别是 {x=a1+p1k1(k1Z)x=a2+p2k2(k2Z),得到 a1+p1k1=a2+p2k2p1k1p2k2=a2a1,是一个关于 k1,k2 的线性丢番图方程。如果无解那么原方程组无解,否则用 exgcd 解得一组特解中的 k1 的取值 k1 后,所有解中的 k1 的取值可以表示成 k1=k1+p2gcd(p1,p2)k(kZ)。代入 x=a1+p1k1 得到 x=a1+p1k1+lcm(p1,p2)k(kZ),即 xa1+p1k1(modlcm(p1,p2))

对多个方程构成的方程组的情况,只需要两两合并即可。这就是 ExCRT。

CRT sb,不学了

CRT 呢,就是针对 p1p2 的情况,不难发现这种情况下方程组一定有解,且合并之后的模数等于 p1p2。至于过程并不简化很多,复杂度也没变,在 p1/2 非质数的情况下还要 exgcd 求逆元,所以就不学了。

sb CRT 模板题 excited ExCRT 模板题 一份代码能过两题你敢信

阶、原根

对整数 p>1,ap,根据欧拉定理,一定存在 l 使得 al1(modp)。称 a 在模 p 意义下的阶 ordpa 为最小的这样的正整数 l

易证 ax1(modp) 当且仅当 ordpax(只需要反证 + 模拟辗转相除 + 逆元存在性),于是显然有 ordpaφ(p)。易证模意义下 a0ordpa1 互不相等。一个小性质:ordpax=lcm(ordpa,x)x=ordpagcd(ordpa,x),根据意义,正确性显然。

ordpa=φ(p),则称 ap 的一个原根。若 p 有原根,设其中任意一个为 g,那么易证 g0φ(p)1 恰好不重不漏地构成了 p 的简化剩余系,这就很好,能把恒等函数转化成指数函数。

假设 p 有原根,其中任意一个为 g,那么我们考虑对特定的 lφ(p) 有哪些 a 满足 ordpa=l。这个问题不太好直接解答,注意到阶有定义当且仅当 ap,对这样的 a 一定可以用唯一的 gx(x[0,φ(p))) 来表达。于是我们考虑哪些 ordpgx=l。根据小性质,即 φ(p)gcd(φ(p),x)=l,即 gcd(φ(p),x)=φ(p)l。用莫反推柿子的常用技巧,这个式子等价于 φ(p)lxxφ(p)ll。前者是 x=φ(p)lk(k[0,l)),观察后者发现 LHS 不就等于 k 嘛!所以这两个条件合起来的解集就是 x=φ(p)lk(k[0,l),kl),共有 φ(l) 个解。于是得到结论:对有原根的 p,模意义下阶为 l 的数共有 φ(l) 个。这也恰好符合欧拉反演:lφ(p)φ(l)=φ(p)。将 l=φ(p) 代入结论,得到有原根的 p 共有 φ(φ(p)) 个原根。

事实上,上述结论对无原根的 p 不成立:比如 l=φ(p) 时就只有 0a

关于一个数是否有原根,有以下结论:p 有原根当且仅当 p{2,4} 或存在奇质数 p0 和正整数 k 使得 p{pk0,2pk0},证明太烦了不管了,并且也不太本质(这就是你偷懒的理由吗,这似乎是你自没搞懂 Dinic 跑二分图复杂度证明、min25 筛复杂度证明、杜教筛复杂度证明以来第四次不求甚解)。

那么可以用各种方法(临场分解 / 预处理)判断一个数 p 是否有原根,如果有的话原根数量是 φ(φ(p))。数学家王元证明了它的最小原根是 p0.25 级别以内的,那么暴力枚举,判的话就看是否有 φ(p) 的真因数 d 使 ad1(modp),但是你直接枚举真因数哪里枚举的过来,可以对 p 分解质因数 p=pαii,仅对每个 d=ppi 判一下即可,正确性显然。然后求出最小原根 g 后,gx(x[0,φ(p)),xφ(p)) 便是所有原根。模板

阶的 polylog 求法

ap,可以不通过 BSGS 求 x=ordpa

考虑求出 x 的每个质因子的次数。注意到:如果我们知道 xXxXY,其中 YX 的某个质因子,那么 x 的质因子 Y 的次数应该恰好与 X 一样。那么我们可以初始令 X=φ(p),对其每个质因子 Y 都不断验证 xXY 是否成立,如果是的话就令 XXY,否则就停下。这样最终就有 x=X,因为其每个质因子的次数都被确定了。而这个判断是否整除是容易的,xy 当且仅当 ay1(modp),快速幂即可。总复杂度 O(log2p)

离散对数问题

求方程 axb(modp) 的解集。

BSGS 算法

考虑 ap 的情况。那么 a 在模 p 意义下有阶,于是容易得到模意义下 ax 的值是纯循环的,循环节是 ordpa。并且在一次循环内,ax 互不相同,所以一次循环内最多有一个解。易知原方程要么无解,要么解集为 x?(modordpa) 的形式。

所以一般我们先求最小自然数解,然后基本就结束了,毕竟求阶的话也要 BSGS 求 b=1 的方程的次小解(upd:求解其实可以 polylog,已经在上面补上了做法)。其实也可以直接求出原方程的最小解和次小解 x0,x1,那么 ordpa=x1x0。下面讲最小自然数解的求法,那么次小的,或者是区间计数啥的,应该有脑子就会了吧?

考虑令 x=iSj,其中 S=p,i,j[1,S]。这样用 i,j 显然能精准表示出 [0,p) 内的所有 x,那么最小解一定在里面,因为循环节最大为 φ(p)有同学可能要问了,你为啥不取 φ(p) 的平方根呢?你想想看 p 为质数的时候这样也没区别啊,还要多算个欧拉函数(

那么 aiSjb(modp),由于 ap,根据逆元存在性 aj 可以除过去,得到 aiSajb(modp)。那么可以预先把所有 ajb 存进哈希表,然后枚举 i,看哈希表里是否有等于 aiS 的。这样复杂度是 O(p)(不需要快速幂,直接递推)。mol ban

ExBSGS 算法

考虑一般情况(不存在逆元,用不了 BSGS)。ap 的时候是已知问题,于是我们努力将原方程转化为这种情况。设 d=gcd(a,p),如果 d=1 直接 BSGS 即可。否则可以发现 axmodp 仅在 x=0 时为 1,其它时候都一定是 d 的倍数。于是看是否有 b=1,如果是就直接报答案,否则必须满足 db,如果不满足就报无解,否则继续。

a=ad,b=bd,p=pd。那么原方程,如果强行令 x1,那么显然等价于 ax1adbd(modpd);对 x=0 的情况,由于肯定是 b1 才来到这一步的,前面判过了,所以肯定不是解。那么两边和模数都除以 d 显然是前后等价的,得到 ax1ab(modp)。显然有 ap,除过去,得到 ax1b(a)1(modp)。于是我们只需要用 x 代换 x1,得到一个新的同类问题,解掉之后答案就是新问题的答案加一。这样每次递归虽然 a 不变,但是 p 至少减半(或者说 p 被除以的次数上界是它的质因子个数),于是转化到 ap 的情况的步数是对数级别的,复杂度 O(log2p+p)(2log 是因为要求逆元,需要 exgcd)。

求次小解等等的变通应该不用讲了吧。可以发现 a⊥̸paxmodp 是混循环的,不是很优美,自然也就不存在阶之类的定义。无解就不用说了;若只有一个解,说明它是处于混循环在进入循环前的那个前奏中;如果找到最小解和次小解 x0,x1,那么通解是 xx0,xx0(modx1x0)(当然我也相信通解这玩意基本不会考)

mol ban(洛谷的 mol ban 题太垃圾了,管理员又不愿意加强数据

高次剩余问题

鸽子

upd 21.10.22(CSP 考前一天):终于来补了,高次剩余学习笔记 / P5668 - 【模板】N次剩余 题解 - ycx060617 - 博客园 (cnblogs.com)

二次剩余

学完高次剩余,以上帝视角来看二次剩余。

x2a(modp) 的解,其中 p 是奇质数。a=0 先特判掉,以下 a0。设 g 为任意原根,设 a=gα,令 x=gy,原方程等价于 g2ygα(modp),即 2yα(modp1)。可以看到:当 2α 时,有两个解;当 2α 时无解。并且我们知道若 x 是解,则 x 也是解,并且显然 xx,于是可知二次剩余的两个平方根互为相反数。

那么难道要 BSGS 求 α?那样时间复杂度我们不满意。注意到为了判二次剩余,我们只要知道 α 的奇偶性。注意到 2α 等价于 ap121,否则会得到 ap12gp121,快速幂判一下即可。

如何求解?一个思路是试图构造 x2k0a,则 x±xk0。Cipolla 算法给出了一个方案。

为了了解这个算法,我们首先需要了解模意义下扩域的套路。对于二次非剩余 o,我们定义虚数单位 ω 满足 ω2=o,每个模意义下复数表示为 a+bω,满足若 ac,bda+bωc+dω,加法定义为 (a+bω)+(c+dω)(a+c)+(b+d)ω,乘法定义为 (a+bω)(c+dω)(ac+bdo)+(ad+bc)ω,容易验证加法交换律、结合律,乘法交换律、结合律、对加法的线性性。总之满足基本一切实剩余系下的性质(除了欧拉定理、费马小定理),跟与实数对应的复数异曲同工,但由于是离散的,比复数要简单多了。这个套路常用于对二次非剩余强制开方。

下面讲 Cipolla:考虑找到一个 b 使得 ob2a 是二次非剩余,以 o 为虚数单位的平方定义复数,那么可以证明 (b+ω)p+1a(证明见下),那么取 x±(b+ω)p+12 即可(容易证明复数系下 a 依然仅有实平方根,具体证明略)。

引理 1:ωpωp1ωop12ωω

引理 2:在复数系下有 (a+b)pap+bp
证明:不能用到费小,因为对复数失效。二项式定理展开,对 i{0,p}(pi),由于 p 是质数,放在分子上约不掉,所以这一项一定是 p 的倍数,得证。

证明:根据引理 2,(b+ω)p+1(b+ω)(b+ω)p(b+ω)(bp+ωp),对 bp 用费小,对 ωp 用引理 1,等于 (b+ω)(bω)b2ω2b2oa,得证。

如何找到 b?注意到 [1,p) 内有恰好一半二次剩余,随机 check 即可在期望 2 次内找到二次非剩余。同时,b2a 的剩余性应该是关于 b(b0) 保持随机性的。实现就搞个复数类即可。mol ban tea code

Part 2

数论函数、狄利克雷卷积、莫比乌斯反演

一个定义在 N+ 上的函数叫做数论函数。若数论函数 f 满足 f(x)=1(这个看似不需要规定,但如果对 x>1 都有 f(x)=0 就萎了)且对任意 xy 都有 f(xy)=f(x)f(y),则 f 是积性函数;进一步,若对所有 x,y 都满足,则是完全积性函数。设 x 分解质因数为 x=pαii:若 f 是积性函数,则 f(x)=f(pαii);若 f 是完全积性函数,则 f(x)=fαi(pi)(乘法幂)。也就是说,确定一个积性函数的所有质数的幂处的取值,即可确定整个积性函数;对完全积性函数只需确定所有质数处的取值。易证对(完全)积性函数 f,gf×g,fg 也是(完全)积性函数(特殊地,完全积性卷完全积性不一定是完全积性)。

亿些常见的数论函数:

  1. (完全积性)单位函数:ϵ(x)=[x=1]
  2. (完全积性)幂函数:idk(x)=xkk=0 时为常值函数 1k=1 时为恒等函数 id
  3. (积性)除数函数:σk(x)=ixikk=0 时为因数个数函数 dk=1 时为因数和函数 σ
  4. (积性)欧拉函数:φ(x)=ni=1[ix]。对 x 分解质因数,易得 φ(x)=xpi1pi,于是易证积性性;
  5. 不同质因子个数函数:ω(x),它是一个加性函数,满足若 xyω(xy)=ω(x)+ω(y)。加性函数的 exp 显然是积性函数;
  6. (积性)莫比乌斯函数:μ(x)={0αi>1(1)ω(x)otherwise。积性性易证,它的积性函数版本定义为对 pk(pP,kN+)μ(pk)=[k=1]

定义两个数论函数 f,g 的狄利克雷卷积 (fg)(x)=ixf(i)g(xi)。易证狄卷满足交换律、结合律、对加法的分配律。容易发现任何数论函数卷上 ϵ 等于它本身,所以 ϵ 是狄卷单位元;而 (f1)(x) 的意义是 ixf(i),所以 1 是狄卷万恶元。易证对任意 f(1)0 的数论函数 f 都存在唯一数论函数 g 满足 fg=ϵ(证明的话只需要递推构造 g 即可),则 f,g 互为逆元,分别记作 g1,f1。所以狄卷等式可以除来除去反复横跳,非常优美,不像模意义下的乘法逆元还需要当心逆元的存在性。

对完全积性函数 f,它的逆是 f×μ,因为根据提公因式有 (f×μ)f=f×ϵ=ϵ。对积性函数 f,可以证明它的逆一定是积性函数,只不过有些麻烦(但是非常优美):设 g=f1,根据求法有

{g(1)=1g(x)=ix,i>1f(i)g(xi)(x>1)

考虑归纳,设 n1 以前都满足积性性,只要证对 xy,xy=n 都有 g(x)g(y)=g(n)x=1y=1 时显然,否则:

g(x)g(y)=(ix,i>1f(i)g(xi))(jy,j>1f(j)g(yj))=ix,i>1jy,j>1f(ij)g(xyij)=in,ix,iyf(i)g(ni)=in,i>1f(i)g(ni)ix,i>1f(i)g(ni)iy,i>1f(i)g(ni)=in,i>1f(i)g(ni)ix,i>1f(i)g(xi)g(y)iy,i>1f(i)g(yi)g(x)=g(n)+g(x)g(y)+g(y)g(x)=g(n)

得证。

亿些常见的狄卷恒等式:

  1. σk=idk1,这也是除数函数的另一种定义;

  2. 对任意数论函数 f,g,完全积性函数 h(f×h)(g×h)=(fg)×h

  3. μ21=2ω。证明比较显然,考虑 μ2 的数论意义,就是 x 是否不含有平方因子,那该狄卷式显然成立了;

  4. φ1=id

    证明:三者都是积性函数,所以只要证在质数的幂处满足狄卷式即可。对 x=pk(pP,kN+)

    ixφ(i)=ki=0φ(pi)=1+ki=1p1ppi=1+(pk1)=x

    得证;

  5. μ1=ϵ。这是个核心的东西,等价于莫反。这个式子说明 μ1 互为狄卷逆元。

    证明:将 x 分解质因数后,设 x=pi,则显然有

    ixμ(i)=ixμ(i)=|p|i=0(|p|i)(1)i=((1)+1)|p|=[x=1]

    得证;

  6. (这个应该不算狄卷式)φ(x)x=ixμ(i)i。这是上面两条的推论,将 φ1=id1 除过去得到 φ=idμ,即 φ(x)=ixμ(i)xi,两边同除以 x 就得到了。

莫比乌斯反演有两个形式,都是基于 μ1=ϵ:对数论函数 f,g

  1. g(x)=ixf(i),则 f(x)=ixμ(i)g(xi)。证明:这就等价于若 g=f1,则 f=μg。根据 μ1=ϵ,这是显然的;

  2. g(x)=xif(i),则 f(x)=xiμ(xi)g(i)。证明:换个写法,若 g(x)=xif(i),则 f(x)=+i=1μ(i)g(ix)。考虑将前式带入后式的 RHS,有

    RHS=+i=1μ(i)ixjf(j)=xjf(j)ijxμ(i)=xjf(j)ϵ(jx)=f(x)

    得证。

数论函数的求法——筛法

线性筛

埃氏筛可以 O(nloglogn) 求出 n 以内的质数列表。然而有线性的方法,还可以顺带求出指定积性函数的 1n 的值。

埃氏筛慢就慢在,一个数可能被多个质数给筛到。线性筛使得每个数只被最小质因数筛到。这只需要,对每个数,不论是质数和合数,都遍历一下当前质数表,把它的当前质数倍给筛一下。当当前质数能整除当前数时,说明以后的质数不再是当前数乘以对应质数所得结果的最小质因数,就 break;。这样是线性的。

求积性函数有个通法:你只需要快速求出质数的幂处的值,然后对其它数,维护一下最小质因子、最小质因子的最大能整除该数的次数 / 幂等等信息,就可以拆开来计算值了。其实对于非积性函数,但是是和分解质因数有那么点关系的函数(比如加性函数 ω),也是可以顺带求出来的,这个就见机行事了,非常简单。

下面是一份求出 1n 质数表、最小质因子的最大能整除该数的次数、该数除尽最小质因子后的值、dσφωμ 的线性筛 code

min25 筛

o(n) 时间内求特定积性函数 f 的前 n 项的和。

使用该算法的先决条件:f 在质数 p 处的值可以用关于 p 的低次多项式表达出来,并且在质数的幂处的值可以较快算出。事实上对于前者,大部分积性函数都满足,例如 σk(p)=pk+1φ(p)=p1μ(p)=1;对后者也是大部分积性函数都满足。所以可以发现 min25 筛的适用性还是很广的,但它也有它自己的缺点,就是不能顺便获得关键点 nx 处的前缀和。

min25 筛分成两个部分:一是算 n 以内质数的总贡献,二是算合数(当然最后要把 1 处的值 1 加上)。

第一部分:考虑模拟埃氏筛的过程,用一个个质数把所有合数筛掉,最终只剩下质数。由于合数最终不会被算,所以合数处的值搞成什么样都可以,不妨当作质数,和质数享有一样的低阶多项式表达式。考虑对多项式的每一项求和,最终加起来,这样不仅由于多项式低阶,计算次数可以忽略,而且幂函数是完全积性函数,并且前缀和有通项。考虑设 g(i,j) 表示 i 以内的数用前 j 个质数筛过以后剩下来的所有数的幂的和,即所有质数和最小质因子大于第 j 个质数的合数的总贡献。考虑埃氏筛的过程,若 P2j>i,则显然 g(i,j)=g(i,j1);否则 g(i,j1)g(i,j) 显然筛掉了最小质因子恰好等于第 j 个质数的所有合数,根据完全积性函数的性质,转移方程显然有:

g(i,j)=g(i,j1)f(Pj)(g(iPj,j1)g(Pj1,j1))

可以发现,转移到的 i,由于 nab=nab,一定是某个 nx 的值,只有根号个。存储的话,还要进行离散化,这里有个巧方法:对 n 的值记录 i,否则记录 nx=i 的唯一解 x=nig(Pj1,j1) 表示小于 Pj 的质数贡献和。由于仅当 P2jin 的时候才会用到这个转移式,所以这个质数的前缀和可以直接线筛,筛到 n。然后 j 这一维显然可以滚掉,就外层枚举 j,内层倒过来枚举 i 转移。这样滚动还有个好处,就是将 i 排序后,对每个 j 需要更新的 i 是一个后缀,可以直接搞。不难发现第一部分利用了低阶多项式的种种优美性质,以及埃氏筛中 >n 的质数不起作用这个重要的保障复杂度的事情。

第二部分:设 h(i,j) 表示 i 以内最小质因子大于 Pj 的所有数的原积性函数值和。这次是倒过来转移的,即之前 g 的边界 g(i,0) 由于幂函数的优美性质可以直接算,而这次边界为 h(i,pcnt) 仅包含质数的贡献,最后答案是 h(n,0)。考虑转移,计算 h(i,j) 时先把之前算过的质数的贡献算上(以下直接假定 g 为第一部分所计算出的对多项式每一项分别的 g 的和),然后枚举合数的最小质因子及其次数,利用积性函数的性质把值拆出来转移:

h(i,j)=g(i,pcnt)g(Pj,j)+p>j,P2pik1,Pkpif(Pkp)(h(iPkp,p)+[k>1])

g(Pj,j) 依然是那个被线筛预处理的玩意。合数的最小质因子一定 n 这个性质再一次保障了复杂度,保障了 j 的范围是到根号,使得 gh 的状态结构相同(另一个 point 是 h 的有效 i 值也是整除的形式)。枚举最小质因子的时候,也用到了这个性质来保障复杂度。然后就直接爆搜递归转移,边界是 h(i,j)=0(Pj>i),甚至不需要记忆化。

这两个部分的总复杂度被证明是 O(n0.75log1n) 或者是 O(n1ϵ) 我也不知道。总之挺快的,n=1010 大概跑 1s。

min25 筛模板 杜教筛模板(用 min25 筛写的)μ 如果有平方因子那么贡献为 0,所以在第二部分中不需要枚举最小质因子的次数)

杜教筛

o(n) 时间内求特定数论函数(注意不要求是积性函数,虽然大部分情况都是积性函数)对于特定 n 的所有 nx 处的前缀和。

考虑将该数论函数放进一个狄卷式 fg=h 里(以下设它们的前缀和函数为对应大写字母)。如果该函数在右边,也就是 h,那么显然有

H(x)=ijxf(i)g(j)=xi=1f(i)G(xi)

考虑整除分块,对 g 显然要知道每个整除值处的前缀和;对 f 的话,算区间和的时候需要的前缀和是边界处的前缀和,而观察整除分块的代码 r=n/(n/i),所以边界也一定是整除值,于是对 f 依然只需要整除值处的前缀和。那么就能 O(n) 计算 H(n),如果要求每个整除值处的前缀和的话,直接暴力枚举整除分块,被证明是 O(n0.75) 的。如果对 xn23 都线筛预处理,可以证明总体复杂度是 O(n23),达到最优(实际效率跟 min25 筛差不多)。

如果要求的函数在左边,不妨设为 g,那么将上式 i=1 那一项提出来,其余的移到右边去(然后翻一下等式)得到

G(x)=H(x)xi=2f(i)G(xi)f(1)

虽然大部分情况 f 是积性函数,f(1)=1,但是非积性函数的时候也不能忘掉。那么可以对 G 的根号个关键点递推,存储可以仿照 min25 筛里面的 trick。需要的原料是 FH 在关键点的值。这种情况下,想要求出 n 处的前缀和,就必须顺带求出关键点处的前缀和,没得选了,必须是 O(n23),同样要线筛预处理。

我们把可以在 O(n23) 时间内求得所有关键点处前缀和的数论函数称作「可杜教筛的」。那么显然,如果一个数论函数可线筛(需要预处理),可以放到一个狄卷式里,并且该式另两个函数都可杜教筛,则该函数也可杜教筛(知二筛一)。不难发现杜教筛具有很强的构造性,可能在经典的知识体系里较好用,但是如果刻意定义奇怪的积性函数,就萎了;相比之下 min25 筛就很万能了,但它也有缺点:码量大,并且不能求得所有关键点处的前缀和。

放一下几个经典的筛法:对 μμ1=ϵ;对 φφ1=id;对 σkσk=idk1;对 ?×idk(?×idk)(??×idk)=(???)×idk(提公因式)。

模板题


用于求数论函数 / 积性函数前缀和的筛法还有很多,暂时先不学了。min25 筛和杜教筛足以应付绝大多数 OI 比赛里的涉及到数论函数前缀和的数论题。遇到求数论函数前缀和,首先考虑能不能杜教筛(因为好写),如果不能,根据「闫氏题目不毒瘤猜想」,一定不会要求所有关键点处的前缀和(否则就不在我的数论能力范围内),然后 min25 筛直接上。

trick(s)

整除分块

ni=1mi

引理(这个引理是核心,遇到其它更奇怪的关于除法下取整的题,一般都是用这个引理下手):|{ci}|=O(c)。证明的话,就根号分治一下,ic 的显然,否则值是 O(c) 个的。

那么可以把整个 1n 分成若干段,每段的 mi 相等,这样相当于就把整除这个难搞的东西给解决了。写的时候并不需要根号分治地讨论,只需要枚举这样的段 [l,r] 即可。我们从小往大枚举,每次令 l=r+1,那么 r 是多少呢?考虑 cx=d 的解集:即 dcx<d+1,即 cd+1<xcd。前面下界不管,后面上界的下取整就是 r

代码:

for(int l=1,r;l<=n;l=r+1){
	r=min(n,m/l?m/(m/l):inf);
	ans+=(m/l)*(r-l+1);
}

小变化:求 ni=1mif(i)。还是分个块,每块相当于一个固定的数乘以 f 的区间和。

中变化:求 ni=1misif(i)。这次分块需要满足两个整除的值都固定,这样的块数依然是根号 + 根号 = 根号,代码里改成 r=min(n,min(m/l?m/(m/l):inf,s/l?s/(s/l):inf));

大变化:(!@#$%^&*())。需要灵活运用那个引理,来降低复杂度。

狄利克雷前 / 后缀和

对任意数论函数 fg=f1 称为 f 的狄利克雷前缀和。直接暴力算狄卷是线对的,我们有算法能够在 O(nloglogn) 算出 g 的前 n 项。(如果 f 是积性函数那不就线筛了嘛)

将每个数看作 pcnt 维的点,每维的值是所含该质因数的次数。那么狄利克雷前缀和本质上就是个高维前缀和。直接按照质数序列一维一维作用,每维的作用轮得到那些该质数的倍数们。最终复杂度就是 O(pn,pPnp)。这和埃氏筛复杂度分析是一样的,是 O(nloglogn)好耶 终于看到非二进制的高维前缀和应用了

mol ban

对应地,g(x)=xif(i) 称为 f 的狄利克雷后缀和(必要的时候在 里加个上界)。容易发现就是高维后缀和,把高维前缀和倒过来写即可。

posted @   ycx060617  阅读(166)  评论(8编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示