2024.12.23 数论 2 讲课笔记

· · 个人记录

以下 a//b 表示 \lfloor\frac ab\rfloorAdn(n)=\frac{n(n+1)}2Fc(L,R)=Adn(R)-Adn(L-1)

类欧几里得

模板题:P5170 【模板】类欧几里得算法

给定 n,a,b,c ,分别求 \sum_{i=0}^{n}(ai+b)//c, \sum_{i=0}^{n}{((ai+b)//c)}^2, \sum_{i=0}^{n}i\cdot(ai+b)//c 取模,多测 t\le10^50\le n,a,b,c\le10^9,c\ne 0

\large f(n,a,b,c)=\sum_{i=0}^{n}(ai+b)//c \large g(n,a,b,c)=\sum_{i=0}^{n}{((ai+b)//c)}^2 \large h(n,a,b,c)=\sum_{i=0}^{n}i\cdot(ai+b)//c\\

三者同步递归计算

a=0 时,显然有

\large f(n,0,b,c) = (b//c)(n+1) \large g(n,0,b,c) = (b//c)Adn(n) \large h(n,0,b,c) = (b//c)(b//c)(n+1)

a\ge cb\ge c 时,有

\large \begin{aligned} f(n,a,b,c)=&\sum_{i=0}^{n}(ai+b)//c\\ =&\sum_{i=0}^{n}((a\bmod c)\cdot i+c(a//c)\cdot i+(b\bmod c)+c(b//c))//c\\ =&\sum_{i=0}^{n}(((a\bmod c)\cdot i+(b\bmod c))//c+(a//c)\cdot i+(b//c))\\ =&f(n,a\bmod c,b\bmod c,c)+Adn(n)(a//c)+(n+1)(b//c)\\ \end{aligned} \large \begin{aligned} g(n,a,b,c)=&\sum_{i=0}^{n}{((ai+b)//c)}^2\\ =&\sum_{i=0}^n {(((a\bmod c)\cdot i+(b\bmod c))//c+(a//c)\cdot i+(b//c))}^2\\ =&\sum_{i=0}^n (((a\bmod c)\cdot i+(b\bmod c))//c)^2+2\sum_{i=0}^n(((a\bmod c)\cdot i+(b\bmod c))//c)(a//c)i\\ &\quad +2\sum_{i=0}^n(((a\bmod c)\cdot i+(b\bmod c))//c)(b//c)+\sum_{i=0}^n((a//c)\cdot i+(b//c))^2\\ =&g(n,a\bmod c,b\bmod c,c)+2(a//c)h(n,a\bmod c,b\bmod c,c)+2(b//c)f(n,a\bmod c,b\bmod c,c)\\ &\quad +\sum_{i=0}^n(a//c)^2i^2+\sum_{i=0}^n(b//c)^2+2\sum_{i=0}^n i(a//c)(b//c)\\ =&g(n,a\bmod c,b\bmod c,c)+2(a//c)h(n,a\bmod c,b\bmod c,c)+2(b//c)f(n,a\bmod c,b\bmod c,c)\\ &\quad +(a//c)^2\cdot\frac16{n(n+1)(2n+1)}+(n+1)(b//c)^2+n(n+1)(a//c)(b//c)\\ \end{aligned} \large \begin{aligned} h(n,a,b,c)=&\sum_{i=0}^{n}i\cdot(ai+b)//c\\ =&\sum_{i=0}^ni(((a\bmod c)\cdot i+(b\bmod c))//c+(a//c)\cdot i+(b//c))\\ =&\sum_{i=0}^ni(((a\bmod c)\cdot i+(b\bmod c))//c)+\sum_{i=0}^n(a//c)i^2+\sum_{i=0}^n(b//c)i\\ =&h(n,a\bmod c,b\bmod c,c)+(a//c)\frac16{n(n+1)(2n+1)}+(b//c)Adn(n)\\ \end{aligned}

转化为求解 g(n,a\bmod c,b\bmod c,c),h(n,a\bmod c,b\bmod c,c),f(n,a\bmod c,b\bmod c,c)

0\le a< c0\le b<c 时,令 m=(an+b)//c,有:

\large \begin{aligned} f(n,a,b,c)=&\sum_{i=0}^{n}(ai+b)//c\\ =&\sum_{i=0}^n\sum_{j=1}^m[j\le (ai+b)//c]\\ =&\sum_{i=0}^n\sum_{j=1}^m[jc-b-1< ai]\\ =&\sum_{i=0}^n\sum_{j=1}^m[i> (jc-b-1)//a]\\ =&\sum_{j=1}^m\sum_{i=1}^n[i> (jc-b-1)//a]\\ =&\sum_{j=1}^m\left(n-\sum_{i=1}^n[i\le (jc-b-1)//a]\right)\\ =&nm-\sum_{j=1}^m\sum_{i=1}^n[i\le (jc-b-1)//a]\\ =&nm-\sum_{j=0}^{m-1}\sum_{i=1}^n[i\le (jc+c-b-1)//a]\\ =&nm-\sum_{j=0}^{m-1}(jc+c-b-1)//a\\ =&nm-f(m-1,c,c-b-1,a) \end{aligned} \large \begin{aligned} g(n,a,b,c)=&\sum_{i=0}^{n}((ai+b)//c)^2\\ =&\sum_{i=0}^n\sum_{j=1}^{(ai+b)//c}(2j-1)\\ =&2\sum_{i=0}^n\sum_{j=1}^{(ai+b)//c}j-\sum_{i=0}^n\sum_{j=1}^{(ai+b)//c}1\\ =&2\sum_{i=0}^n\sum_{j=1}^{(ai+b)//c}j-\sum_{i=0}^n(ai+b)//c\\ =&2\sum_{i=0}^n\sum_{j=1}^{m}j[j\le (ai+b)//c]-\sum_{i=0}^n(ai+b)//c\\ =&-f(n,a,b,c)+2\sum_{i=0}^n\sum_{j=1}^{m}j[jc-b-1<ai]\\ =&-f(n,a,b,c)+2\sum_{j=1}^{m}j\sum_{i=0}^n[jc-b-1<ai]\\ =&-f(n,a,b,c)+2\sum_{j=1}^{m}j\left(n-\sum_{i=1}^n[jc-b-1\ge ai]\right)\\ =&-f(n,a,b,c)+2\sum_{j=1}^{m}j\left(n-\sum_{i=1}^n[\frac{jc-b-1}a\ge i]\right)\\ =&-f(n,a,b,c)+2\sum_{j=1}^{m}j\left(n-\frac{jc-b-1}a\right)\\ =&-f(n,a,b,c)+2\sum_{j=1}^{m}jn-2\sum_{j=1}^{m}j\cdot\frac{jc-b-1}a\\ =&-f(n,a,b,c)+nm(m+1)-2\sum_{j=0}^{m-1}(j+1)\frac{jc+c-b-1}a\\ =&-f(n,a,b,c)+nm(m+1)-2\sum_{j=0}^{m-1}j\cdot\frac{jc+c-b-1}a-2\sum_{j=0}^{m-1}\frac{jc+c-b-1}a\\ =&-f(n,a,b,c)+nm(m+1)-2h(m-1,c,c-b-1,a)-2f(n,m-1,c,c-b-1,a)\\ \end{aligned} \large \begin{aligned} h(n,a,b,c)=&\sum_{i=0}^{n}i((ai+b)//c)\\ =&\sum_{i=0}^n i\sum_{j=1}^m [j\le (ai+b)//c]\\ =&\sum_{i=0}^n i\sum_{j=1}^m [jc-b-1< ai]\\ =&\sum_{j=1}^m\sum_{i=1}^n i [jc-b-1< ai]\\ =&\sum_{j=1}^m\sum_{i=1}^n (i -i[i\le (jc-b-1)//a])\\ =&\sum_{j=1}^m\sum_{i=1}^n i-\sum_{j=1}^m\sum_{i=1}^ni[i\le (jc-b-1)//a]\\ =&Adn(n) \cdot m-\sum_{j=1}^m\sum_{i=1}^{(jc-b-1)//a}i\\ =&Adn(n) \cdot m-\frac 12\sum_{j=0}^{m-1}((jc+c-b-1)//a)((jc+c-b-1)//a+1)\\ =&Adn(n) \cdot m-\frac 12\sum_{j=0}^{m-1}((jc+c-b-1)//a)^2-\frac 12\sum_{j=0}^{m-1}((jc+c-b-1)//a)\\ =&Adn(n) \cdot m-\frac 12 g(m-1,c,c-b-1,a)-\frac 12 f(m-1,c,c-b-1,a)\\ \end{aligned}

转化为求解 f(m-1,c,c-b-1,a),g(m-1,c,c-b-1,a),h(m-1,c,c-b-1,a)

递归求解,可证这样时间复杂度为 O(\log\max(a,c))

代码

例 1:CF1098E Fedya the Potter

给定 a_{1\sim n},令 b 为可重集 \left\{\gcd_{l\le k\le r} a_k\mid1\le l\le r\le n\right\} 排序后的结果,c 为可重集 \left\{\sum_{l\le k\le r}b_k\mid1\le l\le r\le n\right\} 排序后的结果,求 c 的中位数,n\le5\times10^4,1\le a_i\le10^5

对于一个 r|\left\{\gcd_{l\le k\le r} a_k\mid1\le l\le r\right\}|=O(\log n)

因此先对 a 建立 gcdST 表,然后枚举 r,通过 O(\log n) 次二分将 [1,r] 划分为 O(\log n) 块,满足对于任意一块 S=[L,R]\gcd_{l\le k\le r} a_k\;(L\le l\le R) 值相同,从而求出 cnt_i,表示 \gcd_{l\le k\le r} a_k=i(l,r) 数量(即代码中的 b 数组),这部分时间复杂度为小常数的 O(n\log^2 n\log V)

这样 b 即为 cnt_11 拼接上 cnt_22 拼接上 ······ 拼接上 cnt_{V}V,其中 V 为值域大小

二分中位数 M,问题转化为求出 b 中有多少区间和不超过 M 的区间

cnt_kk 为第 k

在第 k 段中,一共有 Fc(cnt_i-\min(cnt_i,M//i)+1,cnt_i) 个区间和 \le M 的区间,这部分容易 O(V) 计算

对于跨段的区间,设其左端点位于第 l 段,右端点位于第 r

预处理 ct_i=\sum_{j=1}^i cnt_jsm_i=\sum_{j=1}^i cnt_j\cdot j

sm_r-sm_{l-1}\le M,则第 l 段内任意位置和第 r 段内任意位置都合法

sm_r-sm_{l-1}>Msm_{r-1}-sm_l+l-r\le M,则第 l 段内和第 r 段内部分位置合法

其他情况全不合法

因此枚举右端点,双指针或二分确定上述两种情况的范围,前者容易通过 ctb 数组单次 O(1)算出,后者可转化为给定 n,m,a,b,c,求 \sum_{i=1}^n\sum_{j=1}^m [ai+bj\le c]

F(a,b,c)=\sum_{i=1}^\infty\sum_{j=1}^\infty [ai+bj\le c],则 \sum_{i=1}^n\sum_{j=1}^m [ai+bj\le c]=F(a,b,c)-F(a,b,c-an)-F(a,b,c-bn)+F(a,b,c-an-bn)

\large\begin{aligned} F(a,b,c)=&\sum_{i=1}^{c//a}(c-ai)//b\\ =&\sum_{i=0}^{(c//a)-1}(c-a((c//a)-i))//b\\ =&\sum_{i=0}^{(c//a)-1}(c-a(c//a)+ci)//b\\ =&\sum_{i=0}^{(c//a)-1}((c\bmod a)+ci)//b\\ \end{aligned}

转化为类欧几里得的形式,可 O(\log\max(c\bmod a,b))=O(\log\max(a,b))

总时间复杂度 O(n\log^2n\log V+(\log n+\log V)V\log V)=O(n\log n^2\log V+V\log^2V),瓶颈在于求 cnt 的过程

代码

例 2:P5172 Sum

给定 Tn,r,求 \sum_{d=1}^n (-1)^{\lfloor d\sqrt r\rfloor}T\le10^4,n\le10^9,r\le10^4

r 为完全平方数,设 r=x^2,则 \sum_{d=1}^n (-1)^{\lfloor d\sqrt r\rfloor}=\sum_{d=1}^n (-1)^{dx}=\sum_{d=1}^n ((-1)^x)^d,若 x 为偶数则答案为 n,否则若 n 为奇数答案为 -1,为偶数答案为 0

否则由于 (-1)^x=1-2(x\bmod 2)=1-2(x-2(x//2))=1-2x+4(x//2),原式等于 n-2\sum_{d=1}^n\lfloor d\sqrt r\rfloor+4\sum_{d=1}^n\lfloor \frac {d\sqrt r}2\rfloor

转化为求解形如 \sum_{i=1}^n\lfloor\frac{a\sqrt r+b}c\cdot i\rfloor 的式子

f(n,a,b,c,r)=\sum_{i=1}^n\lfloor\frac{a\sqrt r+b}c\cdot i\rfloor

n=0$ 时显然 $f(n,a,b,c,r)=0

否则先对 \frac{a\sqrt r+b}c 约分(a,b,c 都除以 \gcd(a,b,c),若不约分则中间过程可能超过 long long,若约分则可保持在 int 范围内)

t=\frac{a\sqrt r+b}c

t\ge 1,则取出其整数部分,可得 f(n,a,b,c,r)=f(n,a,b-c\lfloor t\rfloor,c,r)+\lfloor t\rfloor\cdot\frac{n(n+1)}2

0\le t<1,则

\begin{aligned} f(n,a,b,c,r)=&\sum_{i=1}^n\lfloor ti\rfloor\\ =&\sum_{i=1}^n\sum_{j=1}^{\lfloor tn \rfloor}[j\le ti]\\ =&\sum_{i=1}^n\sum_{j=1}^{\lfloor tn \rfloor}\left[\frac jt\le i\right]\\ =&\sum_{j=1}^{\lfloor tn \rfloor}\sum_{i=1}^n\left[\frac jt\le i\right]\\ =&\sum_{j=1}^{\lfloor tn \rfloor}\sum_{i=1}^n\left[\frac jt< i\right]\text{(}t\text{ 为无理数,因此} \frac jt \text{为无理数,故} i\ne \frac jt\text{)}\\ =&\sum_{j=1}^{\lfloor tn \rfloor}\left(n-\sum_{i=1}^n\left[j\le\frac jt\right]\right)\\ =&\sum_{j=1}^{\lfloor tn \rfloor}\left(n-\left\lfloor\frac jt\right\rfloor\right)\\ =&\sum_{j=1}^{\lfloor tn \rfloor}\left(n-\left\lfloor\frac j{\,\frac{a\sqrt r+b}c\,}\right\rfloor\right)\\ =&\sum_{j=1}^{\lfloor tn \rfloor}\left(n-\left\lfloor\frac c{a\sqrt r+b}\cdot j\right\rfloor\right)\\ =&n\lfloor tn \rfloor-\sum_{j=1}^{\lfloor tn \rfloor}\left\lfloor\frac c{a\sqrt r+b}\cdot j\right\rfloor\\ =&n\lfloor tn \rfloor-\sum_{j=1}^{\lfloor tn \rfloor}\left\lfloor\frac {c(a\sqrt r-b)}{(a\sqrt r+b)(a\sqrt r-b)}\cdot j\right\rfloor\\ =&n\lfloor tn \rfloor-\sum_{j=1}^{\lfloor tn \rfloor}\left\lfloor\frac {ca\sqrt r-cb}{a^2r-b^2}\cdot j\right\rfloor\\ =&n\lfloor tn \rfloor-f(\lfloor tn \rfloor,ca,-cb,a^2r-b^2)\\ \end{aligned}

递归处理即可

可证时间复杂度为 O(T\log n)

代码

万能欧几里得

在平面上有线段 y=\frac{px+r}q\{0< y\le n\},其中 p,q,r 为整数。有变换 UR 和初始值 S,从原点出发,先向上到达 (0,\frac rq),然后从左往右沿线段行走,若横坐标为整数则 S\leftarrow S\times U,若纵坐标为整数则 S\leftarrow S\times R,若都为整数则 S\leftarrow S\times U\times R,求最终的 S0\le p,q,r\le10^9,q\ne0,变换有结合律

f(n,p,q,r,U,R) 为上述所有变换之积

若使用快速幂实现,则可证时间复杂度为 O(T\log\max(p,q)),其中 T 为单次变换时间

模板:

namespace euclid {
    using ll = long long;
    inline constexpr ll cal(ll a, ll b, ll c, ll d){return (__int128_t(a) * b + c) / d;}//fma(a, b, c) / d
    template <typename _Tp> inline _Tp fpw(_Tp a, ll b, _Tp e){for (; b; b >>= 1, a = a * a)if (b & 1)e = e * a;return e;}
    template <typename _Tp> _Tp euclid(ll p, ll q, ll r, ll n, const _Tp &U, const _Tp &R, const _Tp &e/*unit*/){
        if (!n)return e;
        if (r >= q)return fpw(U, r / q, e) * euclid(p, q, r % q, n, U, R, e);
        if (p >= q)return euclid(p % q, q, r, n, U, fpw(U, p / q, e) * R, e);
        ll m = cal(p, n, r, q);if (!m)return fpw(R, n, e);
        return fpw(R, (q - r - 1) / p, e) * U * euclid(q, p, (q - r - 1) % p, m - 1, R, U, e) * fpw(R, n - cal(q, m, -r - 1, p), e);
    }
}

考虑用万欧解决类欧模板

所有操作都可用矩阵描述

需要取出有用位置,否则常数过大

例:LOJ #6440. 万能欧几里得

给定矩阵 A,Bn,p,q,r,求 \sum_{i=1}^n A^i B^{(ip+r)//q}n\le20,p,q,r\le10^{18}

在万欧过程中维护 \sum x\sum y\sum xy 即可

由于矩乘没有交换律,需要注意合并顺序

代码

参考

积性函数 和 狄利克雷卷积

常用积性函数

单位函数 \varepsilon(n)=[n=1]

恒等函数 \operatorname{id}_k(n)=n^k,若 k=1 则省略

常函数 I(n)=1,有时也写为 \operatorname{1}(n)

除数函数 \sigma_k(n)=\sum_{d\mid n}d^kk=1 时省略,k=0 时即为因子数 d(n)

欧拉函数 \varphi(n)

莫比乌斯函数 \mu(n)

狄利克雷卷积

$$ f(n)=\sum_{ab=n}f(a)g(b) $$ 满足: $$ f\ast g=g\ast f$$ $$ (f\ast g)\ast h= f\ast(g\ast h) $$ $$ f\ast(g+h)=f\ast g+f\ast h$$ $$ f=g\iff f\ast h=g\ast h(h(1)\ne 0) $$ $$ f\ast\varepsilon=f $$ (完全)积性函数的狄利克雷卷积也是(完全)积性函数 (积性函数的逆也是积性函数) 一些例子: - $ \varepsilon=\mu\ast I

杜教筛

f$ 为数论函数,要求 $\sum_{i=1}^n f(i)

若可以构造 gh,满足 f\ast g=h 且可以在不超过 O(n^{3/4}) 的复杂度内求出所有 n//i 处的 gh 的前缀和,则可以 O(n^{3/4}) 求解(若 f 为积性函数,则可以线性筛预处理 1\sim n^{2/3}f 的前缀和,做到 O(n^{2/3}),当然此时 gh 的前缀和需要 O(n^{2/3}) 内求出),同时求出所有 n//i 处的前缀和

F,G,Hf,g,h 的前缀和

H(n)=\sum_{i=1}^n h(i)=\sum_{ij\le n}f(j)g(i)=\sum_{i=1}^n g(i) F(n//i)=g(1)F(n)+\sum_{i=2}^n g(i)F(n//i)

F(n)=\frac{H(n)-\sum_{i=2}^n g(i)F(n//i)}{g(1)}

数论分块即可

需要记忆化

模板题:P4213 【模板】杜教筛

\varphi\mu 的前缀和,n\le INT\_MAX

由于 \varepsilon=\mu\ast I \operatorname{id}=\varphi\ast I,直接套模板即可

代码

Powerful Number 筛

要求 f 为积性函数,其质数处取值可快速计算,且存在积性函数 g,满足两者质数处取值相同,且 g 可快速求所有 n//i 处的前缀和

定义 Powerful\;\; NumberPN)为 \nexists (p\mid x,p\in\{Prime\}),p^2\nmid xx

可证 PN 都能表示为 a^2b^3n 以内 PN 只有 O(\sqrt n)

构造 h 为满足 g\ast h=f 的函数,显然其为积性函数

p 为素数,则 f(p)=g(1)h(p)+g(p)h(1)=h(p)+g(p),由于 f(p)=g(p),有 h(p)=0,即只有 PNh 才可能非 0

类似杜教筛,可得 F(n)=\sum_{i=1}^n h(i)G(n//i),由于 i\ne \{PN\}h(i)=0,因此 F(n)=\sum_{i\in\{PN\},i\le n}h(i)G(n//i)

由于 G 可快速求出,要求 F(n),问题转化为求 h(i)\;(i\in\{PN\})

h$ 为积性函数,因此只要求出所有 $h(p^c)$,其中 $p$ 为质数,$c$ 为大于 $1$ 的整数,且 $p^c\le n

要求 h(p^c) 有两种方法,一种是根据题目推式子,还有一种是可证 h(p^c)=f(p^c)-\sum_{i=1}^c g(p^i)h(p^{c-i}),枚举计算即可

总流程为:

  1. 筛出 \sqrt n 内质数
  2. 枚举 pc,求出所有 h(p^c)
  3. 根据 p 搜索出所有 PN,求出 PN 处的 h 的值
  4. 求出 n//i 处的 G 的值
  5. 得到 F(n)

除第 2 步外时间复杂度为 O(\sqrt n),第二步若采用第二种方法则时间复杂度为宽松的 O(\sqrt n\log n),有时可继续优化

若使用杜教筛计算 G,则时间复杂度为 O(n^{2/3})

空间复杂度为 O(\sqrt n)

例:LOJ #6053. 简单的函数

有积性函数 f 满足 f(p^c)=p\oplus c,给定 n ,求 f 前缀和,n\le10^{10}

构造 g(n)=\begin{cases}3\varphi(n)&n\bmod2=0\\\varphi(n)&n\bmod2=1\end{cases}

根据 PN 筛的方式,以下只考虑计算 G

可证 G(n)=\sum_{i=1}^n\varphi(i)+2\sum_{i=1}^{n//2}\varphi(2i)

S_1(n)=\sum_{i=1}^n\varphi(i),S_2(n)=\sum_{i=1}^{n//2}\varphi(2i),可证 S_2(n)=S_1(n)+S_2(n//2),显然 S_1 可以杜教筛求解,S_2 在求出 S_1 必须值的基础上可单次 O(\log n) 求解

总时间复杂度 O(n^{2/3})

也可用 Min\_25 筛做,只要注意 f(2) 的处理,代码

Min_25 筛

具体介绍见 文章 Min_25 筛

例 1:LOJ #6235. 区间素数个数

Min\_25 筛前半部分即可

代码

例 2:P5325 【模板】Min_25 筛

模板题,代码

vjudge 练习

Number Theory 2,pw:edgeedgeweloveyou

luogu 题单

24.12.23 math2

参考

math2.pdf by Tx_Lcy

oi-wiki 数论