数论分块
- $\left \lfloor \frac{n}{i} \right \rfloor$ 只有 $O(\sqrt{n})$ 个值
- 区间 $(\left \lfloor \frac{n}{i} \right \rfloor, \left \lfloor \frac{n}{\left \lfloor \frac{n}{i} \right \rfloor} \right \rfloor)$ 内的取值是一样的,右侧是右端点,一整段值相同的左端点可能还能向左扩, $\left \lfloor \frac{n}{i} \right \rfloor$ 的取值范围是$(\left \lfloor \frac{n}{\left \lfloor \frac{n}{i} \right \rfloor + 1} \right \rfloor+1,\left \lfloor \frac{n}{\left \lfloor \frac{n}{i} \right \rfloor} \right \rfloor)$
- $\left \lfloor \frac{n}{ab} \right \rfloor = \left \lfloor \frac{\left \lfloor \frac{n}{a} \right \rfloor}{b} \right \rfloor = \left \lfloor \frac{\left \lfloor \frac{n}{b} \right \rfloor}{a} \right \rfloor$
- $\sum_{i=1}^{n}\left \lfloor \frac{n}{i} \right \rfloor i = \sum_{i=1}^{n}\frac{\left \lfloor \frac{n}{i} \right \rfloor (\left \lfloor \frac{n}{i} \right \rfloor + 1)}{2}$ ,类似等差数列求和
- 向上取整也有上述性质
使用
有了上述性质,有式子 $F(n) = \sum_{i=1}^{n}f(i) \left \lfloor \frac{n}{i}\right \rfloor$ ,如果可以 $O(1)$ 的求出 $f$ 的区间和,就可以 $O(\sqrt{n})$ 的求出 $F(n)$ 。
同理 $F(n) = \sum_{i=1}^{n}f(i) g(\left \lfloor \frac{n}{i}\right \rfloor)$ 求法类似。
相关代码
求 $F(n) = \sum_{i=1}^{n} f(i) \left \lfloor \frac{n}{i} \right \rfloor$ 的代码 : $O( \sqrt{n} )$
1 |
|
类似的,若上限为 $m (m \leqslant n)$ ,求 $r$ 时:$r = \min(m, n/(n/l));$
对于 $F(n) = \sum_{i=1}^{ \min(n, m) } f(i) \left \lfloor \frac{n}{i} \right \rfloor \left \lfloor \frac{m}{i} \right \rfloor$ ,只需要在求右端点 $r$ 时改为 \(r = \min(n/ (n/l), m/ (m/l));\) 类似变形还有 $\sum_{i=1}^{n} k \% i= \sum_{i=1}^{n} k - \left \lfloor \frac{k}{i} \right \rfloor i= nk - \sum_{i=1}^{n}\left \lfloor \frac{k}{i} \right \rfloor i$
1 |
|
积性函数
定义
有以下几种定义:
- 满足$f(ab) = f(a) * f(b)$且$gcd(a, b) == 1$,$f$ 为积性函数
- 满足$f(ab) = f(a) * f(b)$且$gcd(a, b)>1$, $f$为完全积性函数
- 若积性函数满足$f(p^n) = f^n(p)$, $f$为完全积性函数
性质
- 两个积性函数的狄利克雷卷积还是积性函数
- 积性函数的逆也是积性函数
- 由定义可得:若 $n = p_{1}^{q_{1}} p_{2}^{q_{2}} …p_{k}^{q_{k}}$ 则 $f(n) = f(p_{1}^{q_{1}})…f(p_{k}^{q_{k}})$
应用
根据上述性质三可以对每个 $f(p_{i}^{qi})$ 求值,在 线性筛素数 的过程中可以获得每个质因数的幂。
$\sigma_{k} (n) $ 表示 $n$ 的因子的 $k$ 次方和,$\sigma_{0}(n)$也就表示因子个数
对于常见的$\sigma_{0} $ 和 $\varphi$ 函数,容易求 $\sigma_{0} (p_{i}^{q_{i}}) = q_{i}+1$ , $\varphi (p_{i}^{q_{i}}) = p_{i}^{q_{i}-1}(p_{i}-1) $
推得
$\sigma_{0} (n) = \prod_{i=1}^{k} (q_{i}+1)$
$\varphi (n) = \prod_{i=1}^{k} p_{i}^{q_{i}-1}(p_{i}-1) = \prod_{i=1}^{k} \frac{p_{i}^{q_{i}-1}(p_{i}-1)}{p_{i}}p_{i} = n \prod_{i=1}^{k} (1-\frac{1}{p_{i}})$
$(\varphi*I) (p^k) = \sum_{d | p^k}\varphi(d) = \sum_{i=0}^{k}\varphi(p^i) = 1+(p-1)+p(p-1)+p^2(p-1)+…+p^{k-1}(p-1) = p^k $ |
所以有 $\varphi * I = id$
常见完全积性函数
单位元函数 : $\epsilon(n) = [n=1] $ —— $\epsilon * f = f$
幂函数 : $id_{k}(n) = n^k$
恒等函数 : $I(n) = 1 = id_0(n)$
单位函数 : $id(n) = n = id_1(n)$
常见积性函数
欧拉函数 : $\varphi(n) $ $∑_{d|n}\varphi(d)=n$
莫比乌斯函数 : $\mu(n) $ —— $ \mu*I = \epsilon$
$∑_{d|n}μ(d)=[n=1]$
约数和函数 : $\sigma (n)$ —— $n$ 的所有约数和
约数个数函数 : $T(n) $—— $n$ 的全部约数个数 = $\sigma_{0}(n)$
因数函数 : $\sigma_{k}(n) = \sum_{d | n} d^k$——n的所有约数的k次方和 |
狄利克雷卷积
定义
$h(n) = \sum_{d | n} f(d)g(\frac{n}{d})$ |
简写为 :$h = f*g$
性质
- $fg = gf$
- $fgh = f(gh)$
- $f(g+h) = fg + f*h$
- 若 $f$ , $g$ 为积性函数,则 $h=f*g$ 也为积性函数
- 逆元 : 对每个 $f(1)\neq 0$ 的函数 $ f $,都存在一个函数 $g$ 使得$f*g=\epsilon$
常用狄利克雷卷积
$I * \mu = \epsilon$
$\mu * id = \varphi$
$I * id = \sigma$
$I * I = T = \sigma_0$
$I * \varphi = id$
结论
$n = \sum_{d | n} \varphi(d)$ |
$\sigma(n) = \sum_{d | n} T(d) \varphi(\frac{n}{d})$ |
$A_{i} = \sum_{j=0}^{i} C_{i}^{j}B_{j}$ 反演得$\Rightarrow$ $B_{i} = \sum_{j=0}^{i}(-1)^jC_{i}^{j}*A_{j}$
莫比乌斯反演
概念引入
定 $\mu$ 为 $I$ 的逆,有 $\mu * I = \epsilon$ ,容易推出: \(\mu(p^k) = \left\{\begin{matrix} 1 & k=0 & \\ -1& k=1 & \\ 0 & k>1 \end{matrix}\right.\) 对于 $n=\prod_{i=1}^{k} p_{i}^{q_{i}}$ ,有: \(\mu(n) = \left\{\begin{matrix} (-1)^k & 所有 q_{i} 都为1 & \\ 0 & 其他 & \end{matrix}\right.\) 现有积性函数 $f$ , 定 $g = fI$ , 有 $f = fI* \mu = g* \mu$ 即: \(g(n) = \sum_{d|n} f(d)\)
\[f(n) = \sum_{d|n} g(d) \mu(\frac{n}{d})\]公式中的 $i$ 和 $j$ 交换也是成立的 \(g(n) = \sum_{n|d} f(d)\)
\[f(n) = \sum_{n|d} g(d) \mu(\frac{d}{n})\]例题
洛谷P2257
题目
给定 $n, m$ 求 $\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)是素数]$ .
范围:$n,m \leq 1e7$ ,数据组数 $T \leq 1e3$ .
解法
前置知识:$d | gcd(a,b) \Leftrightarrow d | a,d | b$ . |
设函数 $f(x) = [x是素数]$ ,找一个函数 $g$ 满足 $f = gI$ ,那么 $g = f\mu$ \(g(x) = \sum_{d|x} [d是素数] \mu(\frac{x}{d}) \\ = \sum_{p|x} \mu(\frac{x}{p})\) 可用以下代码求得 $g(n)$ ,$O(nloglog n)$:
1 |
|
$g(d)$ 可以用上述代码预处理出前缀和,后面部分数论分块单次询问时间复杂度 $O(\sqrt{n}+\sqrt{m})$
简单题
题目
$T$ 组询问,每次给定 $n, m$ 求 $\sum_{i=1}^{n}\sum_{j=1}^{m}gcd(i,j)$ .
范围:$n,m \leq 1e6$ ,数据组数 $T \leq 1e4$ ,答案对 $998244353$ 取模 .
题解
利用常用的积性函数 $id(n) = n$ ,已知 $id= \varphi * I$ \(\sum_{i=1}^{n}\sum_{j=1}^{m}gcd(i,j) = \sum_{i=1}^{n}\sum_{j=1}^{m}id(gcd(i,j))\\ =\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{d|gcd(i, j)} \varphi(d) \\ =\sum_{d=1}^{\min(n,m)}\varphi(d) \sum_{i=1}^{n}[d|i]\sum_{j=1}^{m}[d|j]\\ =\sum_{d=1}^{\min(n, m)}\varphi(d) \left \lfloor \frac{n}{d} \right \rfloor \left \lfloor \frac{m}{d} \right \rfloor\) 和上题类似,预处理出 $\varphi$ 的前缀和,后面部分直接数论分块即可。
又一题
题目
给出数列 $f_1, f_2,…,f_N$ 的值
$T$ 组询问,每次给定 $n, m$ ,求 $\sum_{i=1}^{n} \sum_{j=1}^{m} f_{gcd(i, j)}$
数据范围:$T \leq 1e4$,$n,m \leq N \leq1e6$
题解
和上题类似,要找出一个 $g$ 使 $f = gI$ , 有 $g = f\mu$ , 即 \(g(n) = \sum_{d|n} f(d)\mu(\frac{n}{d}) = \sum_{ij=n}f(i)\mu(j)\) 可以直接用以下代码获得 $g$ 的值, $O(nlogn)$
1 |
|
得到 $g$ 后 \(\sum_{i=1}^{n} \sum_{j=1}^{m} f_{gcd(i, j)}=\sum_{i=1}^{n} \sum_{j=1}^{m} \sum_{d|i,d|j}g(d) \\ =\sum_{d=1}^{min(n, m)}g(d) \left \lfloor \frac{n}{d} \right \rfloor \left \lfloor \frac{m}{d} \right \rfloor\) 数论分块即可。
杜教筛
引入
许多数论题目都涉及让求数论函数的前缀和 $S(n) = \sum_{i=1}^{n} f(i)$ , 找一个适当的函数,这里用 $g$ 表示 \(\sum_{i=1}^{n} (f*g)(i) = \sum_{i=1}^{n}\sum_{xy=i}f(x)g(y)\\ =\sum_{y=1}^{n}g(y)\sum_{xy \leq n}^{}f(x)\\ =\sum_{y=1}^{n}g(y)S(\left \lfloor \frac{n}{y} \right \rfloor)\) $y=1$ 时单独提出来 : \(g(1)S(n) = \sum_{i=1}^{n} (f*g)(i) - \sum_{y=2}^{n}g(y)S(\left \lfloor \frac{n}{y} \right \rfloor)\) 所以如果找到适当的函数 $g$ 后能够快速的算出 $\sum_{i=1}^{n} (f*g)(i)$ ,就可以用数论分块在 $O(n^{\frac{3}{4}})$ 的时间复杂度内算出 $S(n)$ 的值。
类似的还有让求 $S(n) = \sum_{i=1}^{n}(f \cdot g)(i)$ 的值,且 $g$ 为完全积性函数,此时有 \(\sum_{i=1}^{n} ((f*I)\cdot g)(i) = \sum_{i=1}^{n}g(i)\sum_{d|i}f(d) \\ = \sum_{i=1}^{n}\sum_{d=1}^{\left \lfloor \frac{n}{i} \right \rfloor}f(d)\cdot g(i\cdot d)\\ =\sum_{i=1}^{n}\sum_{d=1}^{\left \lfloor \frac{n}{i} \right \rfloor}f(d)\cdot g(d) \cdot g(i)\\ =\sum_{i=1}^{n}g(i)S(\left \lfloor \frac{n}{i} \right \rfloor)\) 提出 $y=1$ 部分 \(g(1)S(n) = \sum_{i=1}^{n} ((f*I)\cdot g)(i) - \sum_{i=2}^{n}g(i)S(\left \lfloor \frac{n}{i} \right \rfloor)\) 类似的还有让求 $S(n) = \sum_{i=1}^{n}(f * g)(i)$ 的值,此时有 \(\sum_{i=1}^{n}(f*g*I)(i) = \sum_{i=1}^{n}\sum_{d|i}(f*g)(d)\\ = \sum_{i=1}^{n}\sum_{d=1}^{\left \lfloor \frac{n}{i} \right \rfloor}(f*g)(d)\\ = \sum_{i=1}^{n}S(\left \lfloor \frac{n}{i} \right \rfloor)\) 又有 \(\sum_{i=1}^{n}(f*I*g)(i) = \sum_{i=1}^{n}\sum_{xy=i}(f*I)(x) \cdot g(y)\\ = \sum_{y=1}^{n}g(y)\sum_{xy\leq n}(f*I)(x)\) 所以 \(\sum_{i=1}^{n}S(\left \lfloor \frac{n}{i} \right \rfloor) = \sum_{y=1}^{n}g(y)\sum_{xy\leq n}(f*I)(x)\) 即 \(S(n) = \sum_{y=1}^{n}g(y)\sum_{xy\leq n}(f*I)(x) - \sum_{i=2}^{n}S(\left \lfloor \frac{n}{i} \right \rfloor)\) 还有可能会用到的:若 $f$ 为完全积性函数,$g,h$ 是数论函数,则 $(f \cdot g)(f\cdot h) = f\cdot (gh)$ ,证明如下 \((f \cdot g)*(f\cdot h)(n) = \sum_{d|n}f(d)g(d)f(\frac{n}{d})h(\frac{n}{d}) \\ = f(n)\sum_{d|n}g(d)h(\frac{n}{d}) \\ = f\cdot (g*h)\)
综上所述
- 让求 $S(n) = \sum_{i=1}^{n} f(i)$ ,有
- 让求 $S(n) = \sum_{i=1}^{n}(f \cdot g)(i)$ ,且 $g$ 是完全积性函数有
- 让求 $S(n) = \sum_{i=1}^{n}(f * g)(i)$ ,有
- 若 $f$ 为完全积性函数,$g,h$ 是数论函数,则 $(f \cdot g)(f\cdot h) = f\cdot (gh)$
例题
洛谷P4213 【模板】杜教筛
题目
求 $\sum_{i=1}^{n}\mu(i)$ 和 $\sum_{i=1}^{n}\varphi(i)$ ,$n \leq 2^{31} -1$
题解
因为 $\mu * I = \epsilon$ ,$\sum_{i=1}^{n}\epsilon(i) = 1$, 所以选 $g = I$ ,直接带入上面的式子即可 \(S(n) = 1-\sum_{i=2}^{n}S(\left \lfloor \frac{n}{i} \right \rfloor)\) 因为 $\varphi*I=id$ ,$\sum_{i=1}^{n}id(i) = \frac{n(n+1)}{2}$ , 依然选 $g=I$,带入 \(S(n) = \frac{n(n+1)}{2}-\sum_{i=2}^{n}S(\left \lfloor \frac{n}{i} \right \rfloor)\)
洛谷P3768 简单的数学题
题目
求 $\sum_{i=1}^{n}\sum_{j=1}^{n}(ij \cdot gcd(i, j)) \mod p$ ,$n,m \leq 1e10$ , $ 5e8 \leq p \leq 1.1e9$ ,且 $p$ 为质数
题解
因为 $id = \varphi * I$ ,所以 \(\sum_{i=1}^{n}\sum_{j=1}^{n}(ij \cdot gcd(i, j))=\sum_{i=1}^{n}\sum_{j=1}^{n}ij\sum_{d|i,d|j}\varphi(d) \\ =\sum_{d=1}^{n}\varphi(d)\sum_{i=1}^{n}i[d|i]\sum_{j=1}^{n}j[d|j] \\ =\sum_{d=1}^{n}\varphi(d)\cdot(d\sum_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}i)^2\\ =\sum_{d=1}^{n}d^2\varphi(d)Sum(\left \lfloor \frac{n}{d} \right \rfloor)^2\) 其中 $Sum(x) = \frac{x(x+1)}{2}$ ,对 $Sum$ 可以考虑数论分块,$d^2\varphi(d)$ 的区间和可以用前缀和算出,如下代码:
1 |
|
现在的任务使如何求 $S(n) = \sum_{i=1}^{n}i^2\varphi(i)$
根据上述引入中的推导,有完全积性函数 $g = id^2$ ,直接带入: \(S(n) = \sum_{i=1}^{n} i^3 - \sum_{i=2}^{n}i^2S(\left \lfloor \frac{n}{i} \right \rfloor)\) 剩下的 $i^2,i^3$ 求和直接用公式即可
BZOJ4176 Lucas的数论
题目
给定 $n$ ,求 $\sum_{i=1}^{n}\sum_{j=1}^{n} d(ij)$ ,$d(k)$ 为 $k$ 的约数个数。$n \leq 1e9$
题解
对 $d(ij)$ ,考虑 $d|ij$ ,令 $a=\frac{i}{gcd(i,d)}, b=\frac{d}{gcd(i,d)}$ ,显然 $a$ 与 $b$ 互质,$a|i,b|j$ \(\sum_{d|ij}I = \sum_{a|i,b|j,a\perp b}I=\sum_{a|i,b|j}[a\perp b]\) 有 \(S(n)=\sum_{i=1}^{n}\sum_{j=1}^{n}d(ij)\\ =\sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{a|i}\sum_{b|j}[a\perp b]\\ =\sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{a|i}\sum_{b|j}\sum_{d|a,d|b}\mu(d)\\ =\sum_{d=1}^{n}\mu(d)(\sum_{d|a}\sum_{a|i,i\leq n}I)(\sum_{d|b}\sum_{b|j,j\leq n}I)\\ =\sum_{d=1}^{n}\mu(d)(\sum_{a=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\left \lfloor \frac{\left \lfloor \frac{n}{d} \right \rfloor}{a} \right \rfloor)^2\) 令 $F(n) = \sum_{i=1}^{n}\left \lfloor \frac{n}{i} \right \rfloor=\sum_{i=1}^{n}\sum_{ij\leq n}I=\sum_{i=1}^{n}d(i)$ 其中 $d(i) = \sum_{ij\leq n}I$ . \(S(n) = \sum_{d=1}^{n}\mu(d)F(\left \lfloor \frac{n}{d} \right \rfloor)^2\)
奇怪的题目
题目
给 $n$ ,求 $\sum_{i=1}^{n}(\mu^2*(id\cdot \mu))(i)$ . $n\leq 1e9$ .
题解
令 $f=\mu^2*(id\cdot \mu)$ ,则 \(id*f=((id\cdot I)*(id\cdot \mu))*\mu^2\\ =id\cdot(I*\mu)*\mu^2\\ =(id\cdot\epsilon)*\mu^2\\ =I*\mu^2\\ =\mu^2\)
\[\sum_{i=1}^{n}(id*f)(i)=\sum_{i=1}^{n}\mu^2(i)\\ =\sum_{i=1}^{n}\sum_{xy=i}f(x)y\\ =\sum_{y=1}^{n}y\sum_{xy\leq i}f(x)\\ =\sum_{y=1}^{n}yS(\left \lfloor \frac{n}{y} \right \rfloor)\]所以 $S(n) = \sum_{i=1}^{n}\mu^2(i) - \sum_{i=2}^{n}i\cdot S(\left \lfloor \frac{n}{i} \right \rfloor)$
接下来的问题是求 $\sum_{i=1}^{n}\mu^2(i)$ ,$\mu^2(i) = [i不含平方因子]$ ,定义 $s(i)=\max_{d^2 | i}d$ ,则 $\mu^2(i) = [s(i)=1]$ . |
$d^2|i,d|s(i)$ , 所以: \(\sum_{i=1}^{n}\mu^2(i)=\sum_{i=1}^{n}[s(i)=i]\\ =\sum_{i=1}^{n}\sum_{d^2|i}\mu(d) \\ =\sum_{d=1}^{\left \lfloor \sqrt{n} \right \rfloor}\mu(d)\left \lfloor \frac{n}{d^2} \right \rfloor\)
又一题
题目
求 $\sum_{i=1}^{n}\sum_{j=1}^{n}lcm(i, j)$
题解
前置1:$\sum_{i=1}^{n} i[i\perp n] = \frac{n\varphi(n)}{2}$ , $(n>1)$ ,即小于等于 $n$ 且和 $n$ 互质的数的和。$n=1$ 时答案为 $1$ 。
证明1:若 $x$ 和 $n$ 互质, 有 $gcd(n, x)==1$ ,显然 $gcd(n-x, x)==1$ ,于是在小于等于 $n$ 且与 $n$ 互质的数中 $x$ 和 $n-x$ 总是成对出现且和为 $n$ , 又因为和 $n$ 互质的数有 $\varphi(n)$ 个,所以总和为 $\frac{n\varphi(n)}{2}$ 。
前置2:$\sum_{d | n}\frac{n}{d}\varphi(\frac{n}{d}) = \sum_{d | n}d\cdot \varphi(d)$ |
令 \(A(n) = \sum_{i=1}^{n} lcm(i, j)\\ = n\sum_{d|n}\sum_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}i[\frac{n}{d}\perp i]\\ = \frac{n}{2}(1+\sum_{d|n}\frac{n}{d}\varphi(\frac{n}{d})) \\ = \frac{n}{2}(1+\sum_{d|n}d\varphi(d))\)
\[S(n) = \sum_{i=1}^{n}\sum_{j=1}^{n}lcm(i, j) \\ = \sum_{i=1}^{n}(\frac{i}{2}(1+\sum_{d|i}d\varphi(d))) \\ = \frac{1}{2}(\sum_{i=1}^{n}i + \sum_{i=1}^{n}i\sum_{d|i}d\varphi(d))\]接下来的任务就是如何求 $s(n) = \sum_{i=1}^{n}i\sum_{d|i}d\varphi(d) = \sum_{i=1}^{n}f(i)$ \(f = id\cdot ((id\cdot \varphi)*I) = (id^2\cdot \varphi )*id\) 有 \(f*id^2 = (id^2\cdot \varphi)*(id^2\cdot I)*id= id^3*id\) 即 \(\sum_{i=1}^{n}\sum_{xy = i}y^2f(x) \\ = \sum_{y=1}^{n}y^2\sum_{xy\leq n}f(x) \\ = \sum_{i=1}^{n}i^2 s(\left \lfloor \frac{n}{i} \right \rfloor) = \sum_{i=1}^{n}(id^3*id)(i)\) 所以: \(s(n) = \sum_{i=1}^{n} (id^3*id)(i) - \sum_{i=2}^{n}i^2s(\left \lfloor \frac{n}{i} \right \rfloor)\)