数论学习笔记
Lucas 定理
定理内容
对于质数 \(p\),有 \(\binom{n}{m} \equiv \binom{n \text{ mod } p}{m \text{ mod } p} \pmod p\)。
另一种形式:记 \(n,m\) 转换成长度为 \(k\) 的 \(p\) 进制数后,为 \(\overline{n_{k-1}n_{k-2}\dots n_1n_0},\overline{m_{k-1}m_{k-2}\dots m_1m_0}\),那么 \(\binom{n}{m} \equiv \prod_{i=0}^{k-1}\binom{n_i}{m_i} \pmod p\)。
推论
\(\binom{n}{m} \equiv 0 \pmod p \Leftrightarrow \exists i\in [0, k), \text{ satisfying } n_i < m_i\)。
理解也很显然,因为 \(p\) 是质数,\(n_i < p, m_i < p\),而 \(\binom{n_i}{m_i}\) 是 \(p\) 的倍数,只有其为 \(0\)。
进一步地,有:
- \(\binom{n}{m} \equiv 1 \pmod 2 \Leftrightarrow n \ \& \ m = m\),此处 \(\&\) 为按位与。
- \(\binom{a+b}{b} \equiv 0 \pmod p\) 等价于 \(a+b\) 在 \(p\) 进制下有进位。
- \(\binom{a+b}{b}\) 中 \(p\) 的因子个数为 \(a+b\) 在 \(p\) 进制下的进位次数。
应用
- 求 \(p\) 很小,\(n, m\) 很大的组合数取模。
- 进行有关组合数的数位 DP。
- exLucas。将模数分解质因数,再用阶乘取模技术算出模 \(q_i^{\alpha _i}\) 的余数,再用 CRT 合并。
例题
洛谷 P3807 【模板】卢卡斯定理/Lucas 定理
模板题,递归处理即可,预处理阶乘及其逆元到 \(10^6\) 量级即可。
洛谷 P8688 [蓝桥杯 2019 省 A] 组合数问题
转换成 \(k\) 进制,使用推论,再进行数位 DP。设 \(f_{i, 0/1, 0/1}\) 表示 DP 到从高往低的 \(k\) 进制第 \(i\) 位,两个数分别有没有填满前缀(即限定当前位的值域),的方案数。分类,转移是 \(O(1)\) 的。
注意取模。
单组数据计算是 \(O(\log_k)\) 的,可以通过。
中国剩余定理
记忆方法:模数为 \(a_1, a_2, \dots, a_n\),余数 \(b_1, b_2, \cdots, b_n\)。对于一个 \(a_i\),求出其他 \(a_i\) 的乘积,找到这个乘积最小的模 \(a_i\) 为 \(1\) 的数,记为 \(c_i\)。答案就是 \(\sum a_ic_i \bmod (\prod a_i)\)。
扩展欧拉定理
内容
- 欧拉定理:若 \(a \perp m\),则 \(a^{\varphi(m)} \equiv 1 \pmod m\)。
- 扩展欧拉定理:
证略。
应用
对于高次降幂且模数不特殊时有用。
例题
洛谷 P5091 【模板】扩展欧拉定理
模板题。
阶
定义
对于给定正整数 \(a,m\) 有 \(a \perp m\),最小的正整数 \(n\) 满足 \(a^n\equiv 1 \pmod m\),则称 \(n\) 为 \(a\) 模 \(m\) 的原根,记作 \(\delta_m(a) = n\)。
求法
由欧拉定理,满足 \(a^x\equiv 1\pmod m\) 的正整数 \(x\) 一定存在(一个解为 \(x=\varphi(m)\))。
反证法易证 \(\delta_m(a)|\varphi(m)\)。
只需枚举 \(\varphi(m)\) 的因数,挨个验证即可。普通枚举方法 \(O(\sqrt{m})\),此处 \(\varphi(m)\) 上限为 \(m-1\)。
原根
定义
对于正整数 \(m\),若有正整数 \(g\in[2, m)\),满足 \(\delta_m(g)=\varphi(m)\),则称 \(g\) 是 \(m\) 的一个原根。
判定
根据定义,求阶即可。
进一步地,根据同余 \(1\) 的特性,我们有如下判定:
- \(g\) 为 \(m\) 的原根,当且仅当不存在质数 \(p|\varphi(m)\),使得 \(g^p \equiv 1 \pmod m\)。
原根存在定理
\(2,4,p^{\alpha},2p^{\alpha}\)(其中 \(p\) 为奇质数)存在原根。
这告诉我们,质数有原根。
计算最小原根
从 \(2\) 枚举 \(g\),依次判断即可。
这里给出了最小原根的范围不超过 \(\log\) 级别。
性质
\(g^{\varphi(m)}\equiv 1 \pmod m\) 告诉我们,\(g\) 的幂次模 \(m\) 的循环节长度是 \(\varphi(m)\)。于是,\(1, g, g^2,\cdots g^{\varphi(m)-1}\) 构成模 \(m\) 的缩系。
证明也很简单;若存在两个数同余,那么不符合 \(g\) 的最小性;其次,\(g\) 的幂次显然没有道理乘出来 \(m\) 的因数(\(\gcd(g, m)=1\))。
例题
洛谷 P6091 【模板】原根
模板题,注意判是否有原根。
大步小步算法(BSGS)
内容
用于求解关于 \(x\) 的同余方程 \(a^x\equiv b \pmod m\)(1) 及 \(x^a \equiv b \pmod m\)(2),其中 \(a \perp m\)。
以(1)为例:
- 设 \(B = \lceil \sqrt m \rceil,x=Bs-t\),其中 \(s, t\in [1, B]\)。
- 我们有 \(a^{BS-t}\equiv b \pmod p \Leftrightarrow a ^ {Bs} \equiv a^tb \pmod p\)。
- 用 map 存下右边的所有取值,左边一一核对即可。
(2)同理,可以令 \(g\) 为 \(p\) 的一个原根,设 \(x=g^X\),就可以转化为指数方程。
这相当于强行折半,时间复杂度 \(O(\sqrt m)\)。
例题
洛谷 P3846 [TJOI2007] 可爱的质数/【模板】BSGS
模板题。
数论分块
内容
有正整数 \(n\) 及 \(i \in [1, n]\),则 \(\left \lfloor \frac{n}{i} \right \rfloor\) 最多有 \(O(\sqrt n)\) 种取值。
记 \(\left \lfloor \frac{n}{i} \right \rfloor\) 的一种取值为 \(n\) 的一个【整除点】。
- 定理:\(n\) 的【整除点】的【整除点】还是 \(n\) 的【整除点】。
原因是,“\(n\) 的【整除点】的【整除点】还是 \(n\) 的【整除点】”可以表示为 \(\left \lfloor \frac{\left \lfloor \frac{n}{i} \right \rfloor}{j} \right \rfloor = \left \lfloor \frac{n}{ij} \right \rfloor\),显然符合整除点的定义。
证明:\(i\le \sqrt n\) 时,最多一个 \(i\) 对应一种取值,显然。\(i>\sqrt n\) 时,这个商一定小于 \(O(\sqrt n)\),即 \(O(\sqrt n)\) 种取值。于是得证。
实现方面,若 \([l, r]\) 为上式值相等的极长区间,那么有 \(r=\left \lfloor \frac{n}{\left \lfloor \frac{n}{l} \right \rfloor} \right \rfloor\)。可用一些放缩证明。
应用
- 一般都是将余数等转化为 \(\left \lfloor \frac{a}{b} \right \rfloor\) 的形式,再求形如上式的和。
- 多变量(\(k\) 维)数论分块:
要求 \(\left \lfloor \frac{n_1}{i} \right \rfloor, \left \lfloor \frac{n_2}{i} \right \rfloor, \cdots, \left \lfloor \frac{n_k}{i} \right \rfloor\) 所共有的相同段,即对于一个 \(l\),求出 \(r_j=\left \lfloor \frac{n_j}{\left \lfloor \frac{n_j}{l} \right \rfloor} \right \rfloor\),真正的右端点 \(r=\min(r_1, r_2, \dots, r_k)\)。
显然总共会有 \(O(k\sqrt n)\) 个分割点,也即只会分这么多段,复杂度也是这个。
例题
洛谷 P2261 [CQOI2007] 余数求和
\(k \bmod i=k - \left \lfloor \frac{k}{i} \right \rfloor \cdot i\)。据此数论分块,对于 \(\left \lfloor \frac{k}{i} \right \rfloor\) 相同的部分,\(i\) 连续,等差数列求和即可。
洛谷 P2260 [清华集训 2012] 模积和
这就是上一题。
需要减掉 \(i=j\) 的部分:
每一个带 \(i\) 的部分都可以用数论分块快速计算。
总时间复杂度 \(O(\sqrt n + \sqrt m)\)。
数论函数的卷积
若数论函数 \(f,g,h\) 满足 \(h(n)=\sum_{d|n}f(n)g(\frac{n}{d})\),则记作 \(h=f*g\),也即 \(h\) 是 \(f\) 和 \(g\) 的卷积。
卷积满足交换律、结合律、分配律。
卷积的单位元是 \(e\)。
常用函数卷积恒等式:
- \(\mu * \text 1 = e\),即莫比乌斯函数与值为 \(1\) 的常函数互为逆元。
- \(\varphi * \text 1 = \text{id}\)。
- 我们将第二个式子左右两边同时卷 \(\mu\),可以得到 \(\varphi = \text{id} * \mu\)。
莫比乌斯反演
内容
核心式子:若 \(f(n)=\sum_{d|n}g(d)\),则 \(g(n)=\sum_{d|n}\mu(d)f(\frac{n}{d})\)。
写成卷积的形式就是若 \(f=g * \text 1\),那么 \(g=f*\mu\)。
应用
常用于求解 \(\sum_{i=1}^{n}\sum_{j=1}^{m}f(\gcd(i, j))\)。
我们设 \(f=g* \text 1\),那么
更有甚者,我们如果知道 \(g\) 的一些性质,可以预处理出 \(g\) 的前缀和,结合数论分块 \(O(\sqrt n)\) 快速求解。
例题
洛谷 P2158 [SDOI2008] 仪仗队
本题要求 \(i, j\) 互质,故 \(f=e\)。故 \(g=e * \mu = \mu\)。带入求解即可。
扫一遍就行,时间复杂度 \(O(n)\)。
洛谷 P3455 [POI 2007] ZAP-Queries
对于每个询问,\(a,b\) 同时除以 \(d\) 就转化为互质。
这里因为有多组询问,所以用数论分块做到每个询问 \(O(\sqrt V)\) 的时间复杂度。需要 \(O(V)\) 预处理 \(\mu\) 的前缀和。总复杂度 \(O(V+n\sqrt V)\),其中 \(V\) 为值域。
洛谷 P2398 GCD SUM
这里 \(f=\text {id}\)。于是 \(g= \text{id} * \mu = \varphi\)。
扫一遍求和即可,时间复杂度 \(O(n)\)。
洛谷 P1829 [国家集训队] Crash的数字表格 / JZPTAB
求 \(\sum_{i=1}^n\sum_{j=1}^m \text{lcm}(i, j) \ (*)\)。
看起来很长,但基本上都是比较套路的变换求和顺序、变换求和变量,当然还有莫反。
记:
于是:
然后,对于 \(10^7\) 的数据,需要一个线性做法。我们发现 \(f\) 函数和外层求和都可以用数论分块。于是时间复杂度 \(O(\sqrt{n+m} \cdot \sqrt{n+m})=O(n+m)\)。
upd 2025/7/11:
实际上上面的算法时间复杂度是 \(O((n+m)^{3/4})\) 的。
同时原式可以进一步化简,做到多组询问 \(O(n+T\sqrt n)\) 的时间复杂度。
设 \(S(n) = \frac{1}2n(n+1),xd=t\),则:
记 \(h(n)=\sum_{d|n}d\cdot\mu(d)\),显然为积性函数(可视为 \(\mu \cdot \text{id}\) 和 \(\text 1\) 的卷积)。
而对于 \(p\) 是质数,有 \(h(p)=1 \times \mu(1)+p\times mu(p)=1-p\)。
且 \(h(p^k)=\sum_{i=0}^{k}p^k \times \mu(p^k)=h(p^{k-1})+p^k\times \mu(p^k)=h(p^{k-1})\),其中 \(k \ge 2\),才有 \(\mu(p^k)=0\)。
故 $\forall k = 1, 2, 3\dots $,有 \(h(p^k)=1-p\)。
可以线性筛预处理 \(h\),做到 \(O(n)\) 预处理,\(O(\sqrt n)\) 回答单次询问。
杜教筛
内容
用于在亚线性时间复杂度内求一个数论函数(不一定积性) \(f(n)\) 的前缀和。
我们构造一个函数 \(g(n)\),同时设 \(h=f*g\)。
记小写字母函数的前缀和为大写字母函数。
于是我们求 \(h\) 的前缀和。
我们尝试从这个式子中找到 \(F(n)\)。显然,\(F(n)\) 就在 \(d=1\) 的项 \(g(1)F(n)\) 里。所以:
一般来说,一个构造得成功的函数 \(g\) 满足 \(g(1) \ne 0\),且大多数情况下筛的是积性函数,故 \(g(1)=1\)。
上面就是杜教筛的核心式子。
杜教筛要求:构造出来的 \(g,h\) 函数前缀和能快速求出。于是可以对右边数论分块,从而递归下去求出答案。
时间复杂度是 \(O(n^{\frac{3}{4}})\) 的。
证明是不太会的没必要会。
而我们通常为了平衡时间复杂度,会将前 \(O(n^{\frac{2}{3}})\) 的数据用线性筛筛出前缀和,后面的部分再用杜教筛,总复杂度 \(O(n^{\frac{2}{3}})\)。
而杜教筛的递归过程中用到了其所有整除点的前缀和值,故其所有整除点的值都会被算到。配合整除分块使用时,由于记忆化的特性,总复杂度并不会变成 \(O(\sqrt n \times n ^{\frac{2}3})=O(n^{\frac{7}6})\),而是维持原来的 \(O(n^{\frac{2}3})\)。
但是,在上面递归的过程中需要记忆化(保证杜教筛的复杂度),需要用 map 或哈希表来存储,所以会带上一个 log 或大常数。
怎么去掉 log 呢?
【施工中】
update 2025/9/7
这里我们想对于求出一个整除点在所有整除点中的排名。
考虑以下事实:
- 对于数列 \(a_i = \left \lfloor \frac n i \right \rfloor, 1 \le i \le \left \lfloor \sqrt n \right \rfloor\),有 \(a_i\) 严格递减。
证明:即证对于所有 \(i < \left \lfloor \sqrt n \right \rfloor\),满足 \(a_i > a_{i+1}\)。
又因为此时 \(\frac n i - \frac n {i+1} = \frac n {i(i+1)} > 1\)。故一定有 \(\left \lfloor \frac n i \right \rfloor > \left \lfloor \frac n {i+1} \right \rfloor\)。
\(\Box\)
- 对于所有 \(1 \le i \le \left \lfloor \sqrt n \right \rfloor\) 且 \(i\) 为整数,都有 \(i\) 是 \(n\) 的整除点。
证明:即证存在整数 \(m\),满足 \(i \le \frac n m < i+1\)。
等价于存在 \(m,\left \lfloor \frac n i \right \rfloor \ge m > \left \lfloor \frac n {i+1} \right \rfloor\)。这等价于上一个事实。
\(\Box\)
记所有整除点个数为 \(m\)。不难得到,整除点 \(d\) 的排名
然后就能用大小为 \(2\left \lfloor \sqrt n \right \rfloor\) 的数组代替 Hash Table。
应用
这里讲一些基本的构造。
- \(\mu\) 的前缀和:
我们有 \(\mu * \text 1 = e\)。令 \(g=\text 1,h=e\) 即可。 - \(\varphi\) 的前缀和:
我们有 \(\varphi * \text 1 = \text{id}\)。令 \(g=\text 1,h=\text{id}\) 即可。 - \(f(n)=n \cdot \varphi(n)\) 的前缀和:
我们构造 \(g=\text{id}\)。故:
- 同样的道理, \(f(n)=n^k\varphi(n)\) 也是可以构造的。显然对于任意的 \(k \in \text N_+,\sum_{i=1}^n i^k\) 都是有公式的。
例题
洛谷 P4213 【模板】杜教筛
模板题。
洛谷 P3768 简单的数学题
就是 \(f(n)=n^2\varphi(n)\) 的构造。
洛谷 P3172 [CQOI2015] 选数
记区间左右端点为 \([L,R]\)。
记 \(f(x)\) 表示选出的数的最大公因数恰好是 \(x\) 的方案数。
记 \(g(x)\) 表示选出的数的最大公因数是 \(x\) 的倍数,即所有选出的数都是 \(k\) 的倍数的方案数,有 \(g(x)=(\left \lfloor \frac{R}{x} \right \rfloor - \left \lfloor \frac{L-1}{x} \right \rfloor)^n\)。
显然我们有 \(g(x) = \sum_{x|d}f(d)\),由莫比乌斯反演,\(f(x)=\sum_{x|d}g(d)\cdot\mu(\frac{d}{x})\)。
再设 \(L'=\left \lfloor \frac{L-1}{k} \right \rfloor,R'=\left \lfloor \frac{R}{k} \right \rfloor\)。故:
杜教筛算 \(\mu\) 的前缀和,整除分块计算即可。时间复杂度 \(\frac{2}3\) 次方。
洛谷 P1587 [NOI2016] 循环之美
- 定理:一个最简分数 \(\frac{p}{q}\) 在 \(k\) 进制下是纯循环小数或整数,当且仅当 \((k, q)=1\)。
自证不难。
于是可以得出想要的式子:
而由莫比乌斯反演的知识,我们可以得到:
记 \(1\) 到 \(n\) 中与 \(k\) 互质的数的个数有 \(S(n)\) 个。
问题转化成了求 \(f(n, k)=\mu(n)[n\perp k]\) 的前缀和 \(F(n, k)=\sum_{i=1}^{n}f(i, k)\),以便整除分块计算。
这里有一个伟大的想法:同构,凑递推式!
注意到 \(\mu(id)\) 有值当且仅当 \(i\perp d\),而这时 \(\mu(id)=\mu(i)\mu(d)\)。
构造完成。
边界有两个:
- \(n=0\) 时,函数值为 \(0\)。
- \(k=1\) 时即 \(\mu\) 的前缀和,杜教筛直接做即可。
计算时间复杂度,需要看一眼 \(F\) 的状态数。
第一维是 \(n\) 的所有整除点(的整除点的……),即数量是 \(O(\sqrt n)\) 级别。
第二维一定都是 \(k\) 的因数,故数量是 \(k\) 的因数个数 \(\sigma_0(k)\) 个,估计为 \(O(k^{\frac{1}3})\)。
跑不满。
杜教筛只会在边界调用,时间复杂度是单独的,\(O(n^{\frac{2}3})\)。
还有个数论分块呢。但是大概的感觉是,每次计算前缀和涉及的总状态数就是 \(O(\sqrt n \times k ^{\frac{1}{3}})\) 级别的。
总时间复杂度 \(O(\sqrt n \times k ^{\frac{1}{3}} + n^{\frac{2}3})\),可以通过。
Powerful Number 筛
内容
用于求解积性函数 \(f(n)\) 的前缀和。
Powerful Number(以下简称 PN)筛通过构造一个函数 \(g\) 以及一个函数 \(h\) 满足 \(f = g * h\),将 \(f\) 的前缀和转化成 \(g\) 的前缀和,记为 \(G(n)\)。
-
Powerful Number
定义一个正整数 \(n=p_1^{\alpha_1}p_2^{\alpha_2}\dots p_k^{\alpha_k}\)(质因数分解)为 PN 当且仅当 \(\forall i = 1, 2, \dots, k\) 有 \(\alpha_i \ge 2\)。特殊地,我们认为 \(1\) 也是 PN。 -
定理:PN 的个数是 \(O(\sqrt n)\) 级别的。
- 引理:PN 必可以表示成 \(a^2b^3\) 的形式,其中 \(a, b\) 为正整数。
考虑任意一个质因子 \(p^k,k\ge 2\),有 \(k\) 在较小情况下均可以表示,更大的时候由裴蜀定理可以表示。
由引理,PN 的个数 \((*)\) 就是:
- 引理:PN 必可以表示成 \(a^2b^3\) 的形式,其中 \(a, b\) 为正整数。
我们构造的函数 \(g\) 应满足如下条件:
- \(g\) 是积性函数。
- \(\forall p \text{ is prime}\) 满足 \(f(p)=g(p)\)。
- \(g\) 易求前缀和,包括用杜教筛求。
一般,积性函数 \(g(1)=h(1)=1\)。
我们注意到对于质数 \(p\),有 \(g(p)=f(p)=g(p)h(1)+g(1)h(p)=g(p)+h(p)\),故 \(h(p)\) 为 \(0\)。
同时应用其积性,易得只有 \(n\) 为 PN 时 \(h(n)\) 才可能不等于 \(0\)。
于是 \(f\) 的前缀和可以表示为:
如果用杜教筛求 \(g\) 的前缀和,那么时间复杂度就是 \(O(n^{\frac{2}3})\);如果直接能算出来,那么时间复杂度就是 \(O(\sqrt n)\)。
这时候最好能快速算出 \(h(p^k)\)。
一种方案是直接推出 \(h\) 关于 \(p\) 和 \(k\) 的表达式。
另一种,根据 \(f(p^k)=\sum_{i=0}^kg(p^i)h(p^{k-i})\) 从更小的 \(p\) 的幂次算出 \(h(p^k)\)。
还有一个问题,是如何高效地枚举 PN 数。直接的想法是 DFS 所有质数。注意一定的剪枝保证 \(O(\sqrt n)\) 的时间复杂度。这样一个一个质因数地枚举可以有效地利用 \(h\) 的积性。
一定要将 PN 数记录下来,在 DFS 外面算一些关于 PN 数的信息,以避免 DFS 的大常数乘进复杂度的其他部分。
例题
LOJ P6053 简单的函数
我们注意到奇质数 \(p\) 有 \(f(p)=p-1=\varphi(p)\)。运用 PN 筛的思路,构造 \(g(n)=\varphi(n)\)。但是这里要修改一下定义,将 \(2\) 排除在外,因为 \(f(2)\ne g(2)\)。同样,定义 Powerless Number 的时候不关心 \(2\) 的幂次。可以证明,这时 PN 的个数仍然是 \(O(\sqrt n)\) 级别的。
剩下来的事情就是推导 \(h(n)\)。应用上面的思路,首先不难得到 \(h(1)=1,h(p)=(p\oplus 1)-p+1\)。再根据 \(f\) 卷积的形式得到 \(h(p^k)\) 的递推式。这里应用了 \(g(p^k)=p\cdot g(p^{k-1})\)。
然后就是搜索和杜教筛。时间复杂度 \(O(n^{\frac{2}3})\)。
注意一定要把 PN 搜出来放进一个 vector,再在搜索的外面用杜教筛。
Min_25 筛
内容
更通用的,求解积性函数 \(f(n)\) 的筛法。
这里要求(\(p\) 为质数):
- \(f(p)\) 是【能快速求和的积性函数之和】。比如常系数多项式。一般也就只考虑常系数多项式。
- \(f(p^k)\) 可以快速计算。
记 \(P_i\) 为从小到大排列的第 \(i\) 个质数。特殊地,\(P_0=1\)。
以下分数统一表示下取整。
定义 \(S(n,j)\) 表示 \(f\) 在,\(n\) 以内的最小质因子 \(>P_j\) 的点值和。
然后发现求 \(f\) 的前缀和,就是在求 \(S(n,0)+f(1)\)。尝试求出 \(S(n,j)\) 的递推式。
分成两类考虑:
- 质数处:如果已经有了前缀和函数 \(q(n)\) 表示 \(f\) 在 \(n\) 以内的质数的点值和。那么 \(S(n,j)=q(n)-\sum_{i=1}^{j}f(P_i)\)。(这里不用 \(q(P_j)\) 的原因是,用了复杂度会假)
- 合数处:考虑某个数 \(i\) 的贡献。可以枚举所有大于 \(P_j\) 的数作为最小的质因数出现,并枚举其次数。那么贡献可以写成:
这里加上 \([e>1]\) 是因为,\(S\) 的这一部分是不含 \(x=1\) 的。
进而,问题就转化成了:求 \(q(n)\),即:
表示 \(f\) 在 \(n\) 以内的质数的点值和。
这里只要求质数的点值和被统计到就行。所以怎么构造都可以。
设完全积性函数 \(f'(p)=f(p)\),即在质数处的取值和 \(f\) 一样。
(这里说一点,求前缀和的时候要把 \(f\) 的常系数多项式分成单项式之和,记为 \(f'_1(p),f'_2(p),\dots\),这样才好表示任意点值的 \(f'\))
再以构造 \(S\) 类似的构造方法,记 \(g(n,j)\) 表示 \(f'\) 在所有质数,或最小质因数大于 \(P_j\) 的点值和。当 \(j\) 充分大的时候(也就是 \(j=tot\),其中 \(tot\) 为小于等于 \(\sqrt n\) 的质数总数),\(g(n,j)\) 显然就等于 \(q(n)\)。所以考虑从 \(g(n, j-1)\) 推到 \(g(n, j)\)。
然后考虑他们两个差在什么地方。显然他们差别在 \(P_j\) 的倍数造成的贡献。这里有分类:
- \(P_j^2 > n\),也就是剩下的数中,不存在最小质因数 \(>P_j\) 的数了。故 \(g(n,j)=g(n, j-1)\)。
- 其他情况,考虑造成贡献的 \(P_j\) 的倍数。(由完全积性)提一个 \(f'(P_j)\) 出来。剩下的数,就都小于等于 \(\frac n {P_j}\) 了。然后就可以统一地用 \(g(\frac n {P_j}, j-1)\) 来表示,而不用像上面算 \(S\) 一样枚举。(原因是,\(f'\) 是完全积性的)
但是这里 \(g(\frac n {P_j}, j-1)\) 包含了一部分质数(也即,“最小质因数小于等于 \(P_{j-1}\) 的数”)。减掉就行。
所以 \(g(n,j) = g(n, j-1) - f'(P_j)\times (g(\frac n {P_j}, j-1) - \sum_{i=1}^{j-1}f'(P_i))\)
\(f'\) 的前缀和用到的不多。暴力预处理就行。
终于做完了。分析一下时间复杂度。
在递归 \(g\) 和 \(S\) 的时候,我们都用了 \(n\) 的整除点处的取值。所以第一维状态数是 \(O(\sqrt n)\) 的。然后对于第二维,【大概,\(S\) 有一点细节】也是只有当 \(P_j^2 \le n\) 的时候才会产生贡献。用 \(O(\frac 1 {\log})\) 来估计质数密度。
如果质数密度用 \(100\%\) 来估计,有点像无根号分治版的杜教筛复杂度分析,是 \(O(n^{0.75})\) 的。然后除以一个 \(\log\),就是 \(O(\frac {n^{\frac 3 4}}{\log n})\) 的。
注意事项
可能有一点宝宝巴士。
- 实现上,计算 \(g\) 需要用 DP 而不是记忆化以保证复杂度(不仅是空间,还有时间)。还需要用到杜教筛的那个去 map 的手法保证空间不爆。
由于神秘原因,\(S\) 函数是不需要进行记忆化的。 - 就举个例子,如果 \(f(p)=2\),如果构造 \(f'(p)=2\) 的话那么合数处的 \(f'\) 值就会变得异常丑陋。反正只会用到质数处取值。就构造 \(f'(p)=1\) 最后再乘 \(2\) 就行。多项式带系数的同理。
应用
洛谷 P5325 【模板】Min_25 筛
模板题。
LOJ 6202 叶氏筛法
相当于求
的前缀和。
这啥都不用管,直接令完全积性函数 \(f'(p)=p\),然后 \(f\) 的前缀和就是 \(g(n,tot)\)。
LOJ 6682 梦中的数论
简单观察可以发现原式就是求 \(f(i)=d(i) \times (d(i)-1) \times \frac 1 2\) 的前缀和。其中 \(d(n)\) 表示因数个数。
拆一下,就是求 \(\sum d(i)^2-\sum d(i)\),再除以 \(2\)。
而再拆 \(\sum d(i)=\sum_{i=1}^n \left \lfloor \frac n i \right \rfloor\),整除分块根号计算,别不动脑子直接筛。
再考虑 \(d(i)^2\) 的前缀和。发现这个,有 \(d(p)^2=2^2=4,d(p^k)^2=(k+1)^2\)。符合 Min_25 筛的条件。
套板子就行了。
SPOJ DIVCNTK Counting Divisors (general) SPOJ VJudge
记 \(d(n)\) 为因子个数,求 \(f(n)=d(n^k)\) 的前缀和。
仍然像上面,发现 \(f(p)=d(p^k)=k+1,f(p^e)=d(p^{ke})=ke+1\),套板子就行了。
UOJ 188【UR #13】Sanrd
定义一个数 \(n\) 的次大质因数 \(f(n)\) 为:
- 若 \(n\) 为质数或 \(1\),则 \(f(n)=0\)。
- 否则,将 \(n\) 的所有质因数写出来。有多少幂次就写多少个。从大到小排序,不去重,取第二个。
求 \(f(n)\) 的前缀和。\(n \le 10^{11}\)。
仍然考虑,设 \(g(n,j)\) 表示最小质因数大于 \(P_j\) 的贡献和。这时候要反着来,考虑如何从 \(g(n,j)\) 推到 \(g(n,j-1)\)。
贡献差仍然来源于最小质因数为 \(P_j\) 的数。设为 \(P_j \times x\),其中 \(x\) 的最小质因数大于等于 \(P_j\),或 \(x=1\)。
首先,因为质数处点值为 \(0\),所以 \(x=1\) 时没有贡献。
大体上就是 \(f(P_j \times x) = f(x)\)。
然后如果 \(x\) 是质数那么 \(f(x)=0\),但是实际上是有贡献的(\(P_j\)),加上就好了。
于是
其中 \(cnt(n,j)\) 表示 \([1,n]\) 内大于 \(P_j\) 的质数个数。然后你发现这个玩意也是可以 Min_25 的。
具体地,\(cnt(n, j)=cnt(n, tot) - j\)。先筛一遍,后面 DP 的时候直接用就行。
然后就做完了。时间复杂度还是 \(O(\frac{n^{\frac 3 4}} {\log n})\)。
LOJ 572 Misaka Network 与求和
首先可以莫反一手。如果有 \(g=\text 1 * f^k\)(这里表示 \(k\) 次幂),那么就有原式等于
考虑使用整除分块。
这时候可以考虑如何求出 \(g\) 的前缀和。
你看看,杜教筛的形式都给你构造好了。\(g=\text 1 * f^k\)。
这时候就可以转化成如何求 \(f^k\) 的前缀和了。
然后你发现如果 \(f(p)=0\) 的话,计算过程和 UOJ 188 Sanrd(上一题)一模一样。只是转移的 \(P_j\) 改成 \(P_j^k\)。
做完啦。
看看时间复杂度。由于用到的都是整除点的前缀和值,并不会因为整除分块和杜教筛而多出一些状态。所以复杂度是不变的。
但是有一件事,杜教筛那里要线性筛处理出来前 \(O(n^{\frac 2 3})\) 的 \(g\) 的点值。\(f^k\) 是可以线性预处理的,但是还要暴力地把 \(f^k\) 和 \(\mu\) 卷起来得到 \(g\)。索性不要杜教筛的“根号”分治了,就让复杂度为 \(O(n^{\frac 3 4})\) 吧。2e9 随便跑。

浙公网安备 33010602011771号