数论学习笔记

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\)
  • 扩展欧拉定理:

\[a^b= \left\{\begin{matrix} \begin{aligned} & a^b, b < \varphi(m) \\ & a^{b \text{ mod } \varphi(m) + \varphi(m)}, b \ge \varphi(m) \end{aligned} \end{matrix}\right. \]

证略。

应用

对于高次降幂且模数不特殊时有用。

例题

洛谷 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] 模积和

\[\begin{aligned} & \sum_{i=1}^{n} \sum_{j=1}^{m} (n \bmod i) \times (m \bmod j) \\ = & (\sum_{i=1}^{n} n \bmod i)(\sum_{i=1}^{m} m \bmod i) \\ \end{aligned} \]

这就是上一题。
需要减掉 \(i=j\) 的部分:

\[\begin{aligned} & \sum_{i=1}^{\min(n, m)} (n \bmod i) \times (m \bmod i) \\ = & \sum_{i=1}^{\min(n, m)} (n - \left \lfloor \frac{n}{i} \right \rfloor \cdot i)(m-\left \lfloor \frac{m}{i} \right \rfloor \cdot i) \\ = & \sum_{i=1}^{\min(n, m)} \left [nm - (m\left \lfloor \frac{n}{i} \right \rfloor+n\left \lfloor \frac{m}{i} \right \rfloor i)\times i + \left \lfloor \frac{n}{i} \right \rfloor \left \lfloor \frac{m}{i} \right \rfloor \cdot i^2 \right] \end{aligned} \]

每一个带 \(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\),那么

\[\begin{aligned} & \sum_{i=1}^{n}\sum_{j=1}^{m}f(\gcd(i, j)) \\ = & \sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{d|\gcd(i, j)}g(d) \\ = & \sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{d|i\wedge d|j}g(d) \\ = & \sum_{d=1}^n \sum_{d|i}^n\sum_{d|j}^mg(d) \\ = & \sum_{d=1}^n\left \lfloor \frac{n}{d} \right \rfloor\left \lfloor \frac{m}{d} \right \rfloor g(d) \end{aligned} \]

更有甚者,我们如果知道 \(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) \ (*)\)

\[\begin{aligned} (*) & = \sum_{i=1}^n\sum_{j=1}^m \frac{ij}{\gcd(i, j)} \\ & = \sum_{i=1}^n\sum_{j=1}^m\sum_{d|i, d|j, \frac{i}{d} \perp \frac{j}{d}}^{\min(n, m)}\frac{ij}{d} \\ & = \sum_{i=1}^n\sum_{j=1}^m\sum_{d|i, d|j, \frac{i}{d} \perp \frac{j}{d}}^{\min(n, m)}d\cdot \frac{i}{d}\cdot\frac{j}{d} \\ & = \sum_{d=1}^{\min(n, m)}\sum_{d|i}^{n}\sum_{d|j}^{m}d\cdot \frac{i}{d}\cdot\frac{j}{d} \cdot [\frac{i}{d} \perp \frac{j}{d} ] \\ & = \sum_{d=1}^{\min(n, m)}\sum_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\sum_{j=1}^{\left \lfloor \frac{m}{d} \right \rfloor}d\cdot i \cdot j \cdot [i \perp j ] \\ & = \sum_{d=1}^{\min(n, m)}d \cdot \left [\sum_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\sum_{j=1}^{\left \lfloor \frac{m}{d} \right \rfloor}i j \cdot e(i \perp j ) \right ] \\ & = \sum_{d=1}^{\min(n, m)}d \cdot \left [ \sum_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\sum_{j=1}^{\left \lfloor \frac{m}{d} \right \rfloor} ij \sum_{x|i, x|j}^{\min(\left \lfloor \frac{n}{d}\right \rfloor, \left \lfloor \frac{m}{d}\right \rfloor)} \mu(x) \right] \\ & = \sum_{d=1}^{\min(n, m)}d \cdot \left [\sum_{x=1}^{\min(\left \lfloor \frac{n}{d}\right \rfloor, \left \lfloor \frac{m}{d}\right \rfloor)} \mu(x) \sum_{i|x}^{\left \lfloor \frac{n}{d} \right \rfloor}\sum_{j|x}^{\left \lfloor \frac{m}{d} \right \rfloor} ij \right] \\ & = \sum_{d=1}^{\min(n, m)}d \cdot \left [\sum_{x=1}^{\min(\left \lfloor \frac{n}{d}\right \rfloor, \left \lfloor \frac{m}{d}\right \rfloor)} \mu(x) \sum_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\sum_{j=1}^{\left \lfloor \frac{m}{d} \right \rfloor} ix \cdot jx \right] \\ & = \sum_{d=1}^{\min(n, m)}d \cdot \left [\sum_{x=1}^{\min(\left \lfloor \frac{n}{d}\right \rfloor, \left \lfloor \frac{m}{d}\right \rfloor)} x^2\mu(x) \sum_{i=1}^{\left \lfloor \frac{n}{xd} \right \rfloor}\sum_{j=1}^{\left \lfloor \frac{m}{xd} \right \rfloor} ij \right] \\ & = \sum_{d=1}^{\min(n, m)}d \cdot \left [\sum_{x=1}^{\min(\left \lfloor \frac{n}{d}\right \rfloor, \left \lfloor \frac{m}{d}\right \rfloor)} x^2\mu(x) \left(\sum_{i=1}^{\left \lfloor \frac{n}{xd} \right \rfloor}i\right)\left(\sum_{i=1}^{\left \lfloor \frac{m}{xd} \right \rfloor}i\right) \right] \\ & = \sum_{d=1}^{\min(n, m)}d \cdot \left [\sum_{x=1}^{\min(\left \lfloor \frac{n}{d}\right \rfloor, \left \lfloor \frac{m}{d}\right \rfloor)} x^2\mu(x) \cdot\frac{1}{2} \left \lfloor \frac{n}{xd} \right \rfloor\left(\left \lfloor \frac{n}{xd} \right \rfloor+1\right)\cdot \frac{1}{2} \left \lfloor \frac{m}{xd} \right \rfloor\left(\left \lfloor \frac{m}{xd} \right \rfloor+1\right) \right] \end{aligned} \]

看起来很长,但基本上都是比较套路的变换求和顺序、变换求和变量,当然还有莫反。

记:

\[f(n, m) = \sum_{x=1}^{\min(n, m)} x^2\mu(x) \cdot\frac{1}{2} \left \lfloor \frac{n}{x} \right \rfloor\left(\left \lfloor \frac{n}{x} \right \rfloor+1\right)\cdot \frac{1}{2} \left \lfloor \frac{m}{x} \right \rfloor\left(\left \lfloor \frac{m}{x} \right \rfloor+1\right) \]

于是:

\[(*)=\sum_{d=1}^{\min(n, m)}d\cdot f(\left \lfloor \frac{n}{d}\right \rfloor, \left \lfloor \frac{m}{d}\right \rfloor) \]

然后,对于 \(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\),则:

\[\begin{aligned} (*) & = \sum_{d=1}^{\min(n, m)}\sum_{d|t}t\cdot\mu\left(\frac{t}d\right)\cdot\frac{t}{d}\cdot S\left(\left\lfloor\frac{n}{t}\right\rfloor\right)S\left(\left\lfloor\frac{m}{t}\right\rfloor\right) \\ & = \sum_{t=1}^{\min(n, m)}S\left(\left\lfloor\frac{n}{t}\right\rfloor\right)S\left(\left\lfloor\frac{m}{t}\right\rfloor\right)\cdot t \cdot\sum_{d|t}\mu\left(\frac{t}d\right)\cdot\frac{t}{d} \\ & = \sum_{t=1}^{\min(n, m)}S\left(\left\lfloor\frac{n}{t}\right\rfloor\right)S\left(\left\lfloor\frac{m}{t}\right\rfloor\right)\cdot t \cdot \sum_{d|t}d\cdot \mu(d) \end{aligned} \]

\(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\)

\[\begin{aligned} (*) & =\sum_{t=1}^{\min(n, m)}S\left(\left\lfloor\frac{n}{t}\right\rfloor\right)S\left(\left\lfloor\frac{m}{t}\right\rfloor\right)\cdot t \cdot h(t) \end{aligned} \]

可以线性筛预处理 \(h\),做到 \(O(n)\) 预处理,\(O(\sqrt n)\) 回答单次询问。

杜教筛

内容

用于在亚线性时间复杂度内求一个数论函数(不一定积性) \(f(n)\) 的前缀和。

我们构造一个函数 \(g(n)\),同时设 \(h=f*g\)
记小写字母函数的前缀和为大写字母函数。
于是我们求 \(h\) 的前缀和。

\[\begin{aligned} H(n) & = \sum_{i=1}^n h(i) \\ & = \sum_{i=1}^n \sum_{d|i}g(d)f(\frac{i}{d}) \\ & = \sum_{d=1}^n g(d) \sum_{d|i} f(\frac{i}{d}) \\ & = \sum_{d=1}^n g(d) \sum_{i=1}^{\lfloor n/d \rfloor}f(i) \\ & = \sum_{d=1}^n g(d) F(\lfloor n/d \rfloor) \end{aligned} \]

我们尝试从这个式子中找到 \(F(n)\)。显然,\(F(n)\) 就在 \(d=1\) 的项 \(g(1)F(n)\) 里。所以:

\[g(1)F(n)=H(n)-\sum_{d=2}^n g(d) F(\lfloor n/d \rfloor) \]

一般来说,一个构造得成功的函数 \(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\) 的排名

\[rank(d)=\left\{\begin{matrix} m-d+1, d \le \left \lfloor \sqrt n \right \rfloor \\ \left \lfloor \frac n d \right \rfloor,\text{otherwise.} \end{matrix}\right. \]

然后就能用大小为 \(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}\)。故:

\[\begin{aligned} h(n) & = (f*g)(n) \\ & = \sum_{d|n}f(d)g(\frac{n}{d}) \\ & = \sum_{d|n}d \cdot \varphi(d) \times \frac{n}{d} \\ & = n \times \sum_{d|n} \varphi(d) \\ & = n^2 \end{aligned} \]

  • 同样的道理, \(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\)。故:

\[\begin{aligned} f(k) & = \sum_{k|d}g(k)\mu(\frac{d}{k}) \\ & = \sum_{d=1}^{+\infty}g(dk)\mu(d) \\ & = \sum_{d=1}^{+\infty}(\left \lfloor \frac{R}{dk} \right \rfloor - \left \lfloor \frac{L-1}{dk} \right \rfloor)^n\mu(d) \\ & = \sum_{d=1}^{R'}(\left \lfloor \frac{R'}{d} \right \rfloor - \left \lfloor \frac{L'}{d} \right \rfloor)^n\mu(d) \end{aligned} \]

杜教筛算 \(\mu\) 的前缀和,整除分块计算即可。时间复杂度 \(\frac{2}3\) 次方。

洛谷 P1587 [NOI2016] 循环之美

  • 定理:一个最简分数 \(\frac{p}{q}\)\(k\) 进制下是纯循环小数或整数,当且仅当 \((k, q)=1\)
    自证不难。

于是可以得出想要的式子:

\[(*)=\sum_{i=1}^n\sum_{j=1}^m[i \perp j][j \perp k] \]

而由莫比乌斯反演的知识,我们可以得到:

\[(*)=\sum_{d=1}^{\min(n,m)} \mu(d)\sum_{d|i}\sum_{d|j}[j\perp k] \\ \]

\(1\)\(n\) 中与 \(k\) 互质的数的个数有 \(S(n)\) 个。

\[\begin{aligned} (*) & = \sum_{d=1}^{\min(n,m)}\mu(d)\lfloor n/i \rfloor \sum_{j=1}^{\lfloor m/d \rfloor} [dj\perp k] \\ & = \sum_{d=1}^{\min(n,m)}\mu(d)\lfloor n/i \rfloor [d\perp k] S(\lfloor m/d \rfloor) \end{aligned} \]

问题转化成了求 \(f(n, k)=\mu(n)[n\perp k]\) 的前缀和 \(F(n, k)=\sum_{i=1}^{n}f(i, k)\),以便整除分块计算。
这里有一个伟大的想法:同构,凑递推式!

\[\begin{aligned} F(n, k) & = \sum_{i=1}^n\mu(i)[i \perp k] \\ & = \sum_{i=1}^n \mu(i)\sum_{d|i, d|k}\mu(d) \\ & = \sum_{d|k}\mu(d)\sum_{i=1}^{\lfloor n/d \rfloor} \mu(id) \end{aligned} \]

注意到 \(\mu(id)\) 有值当且仅当 \(i\perp d\),而这时 \(\mu(id)=\mu(i)\mu(d)\)

\[\begin{aligned} F(n, k) & = \sum_{d|k}\mu(d)\sum_{i=1}^{\lfloor n/d \rfloor} \mu(i)\mu(d)[i\perp d] \\ & = \sum_{d|k}\mu(d)^2F\left(\left \lfloor \frac{n}d\right \rfloor, d\right) \end{aligned} \]

构造完成。
边界有两个:

  • \(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 的个数 \((*)\) 就是:

\[\begin{aligned} (*) & = O\left(\sum_{a=1}^{\sqrt n}\sqrt[3] {\frac{n}{a^2}}\right) \\ & = O\left(n^{\frac{1}{3}} \cdot \int_{1}^{\sqrt n} x^{-\frac{2}{3}} \text d x \right) \\ & = O\left(n^{\frac{1}{3}}\cdot \left.\left (x^{\frac{1}{3}} \right) \right|_{1}^{\sqrt n} \right)\\ &= O\left(n^{\frac{1}{3}} n^{\frac{1}{6}}\right)\\ &= O(\sqrt n) \end{aligned} \]

我们构造的函数 \(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\) 的前缀和可以表示为:

\[\begin{aligned} \sum_{i=1}^{n}f(i) & = \sum_{i=1}^n \sum_{d|i} h(d)g(\frac{i}{d}) \\ & = \sum_{d=1}^{n} h(d) \sum_{i=1}^{\lfloor n/d \rfloor} g(i) \\ & = \sum_{d=1 , d \text{ is PN}}^{n} h(d) G(\lfloor n/d \rfloor) \end{aligned} \]

如果用杜教筛求 \(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})\)

\[h(p^k)=f(p^k) - p \cdot f(p^{k-1}) + h(p^{k-1}),k \ge 2 \]

然后就是搜索和杜教筛。时间复杂度 \(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\) 的数作为最小的质因数出现,并枚举其次数。那么贡献可以写成:

\[\begin{aligned} \sum_{k>j} \sum_{e=1} \sum_{x} f(P_k \times x)[x中不含小于等于P_j的质因数]&=\sum_{k>j} \sum_{e=1}f(P_k^e) \times \sum_{x}f(x) \\ & = \sum_{k>j} \sum_{e=1} f(P_k^e)(S(\frac{n}{P_k^e}, k) +[e > 1]) \end{aligned} \]

这里加上 \([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(n)=\left\{\begin{matrix} n, n \text{ is prime} \\ 0, \text{otherwise.} \end{matrix}\right. \]

的前缀和。

这啥都不用管,直接令完全积性函数 \(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\)),加上就好了。

于是

\[\begin{aligned} & g(n,j-1) - g(n,j) \\ = & \sum_x f(x) + \sum_x [x \text{ is prime}] P_j \\ = & g(\left \lfloor \frac n {P_j} \right \rfloor, j-1) + P_j\times cnt(\left \lfloor \frac n {P_j} \right \rfloor, j-1) \end{aligned} \]

其中 \(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\) 次幂),那么就有原式等于

\[\sum_{d=1}^n \left \lfloor \frac n d \right \rfloor ^2 \times g(d) \]

考虑使用整除分块。
这时候可以考虑如何求出 \(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 随便跑。

posted @ 2025-05-01 16:24  Water_M  阅读(85)  评论(1)    收藏  举报