Part 2 还在施工 & 会补充一些困难的莫反题目。欢迎捉虫或提供好题。
本篇笔记介绍了数论函数和筛法相关的知识点。部分定义和记号见
同余理论。
定义与记号
数论函数:定义域为正整数的函数称为 数论函数 ,可以看成数列。常见数论函数的值域为整数。
加性函数:若对任意 a , b ∈ N + a, b\in \mathbb{N} ^ + a , b ∈ N + 且 a ⊥ b a\perp b a ⊥ b ,均有 f ( a b ) = f ( a ) + f ( b ) f(ab) = f(a) + f(b) f ( ab ) = f ( a ) + f ( b ) ,则称 f f f 为 加性函数 。注意区分数论的加性函数和代数的加性函数 f ( a + b ) = f ( a ) + f ( b ) f(a + b) = f(a) + f(b) f ( a + b ) = f ( a ) + f ( b ) 。
积性函数:若对任意 a , b ∈ N + a, b\in \mathbb{N} ^ + a , b ∈ N + 且 a ⊥ b a\perp b a ⊥ b ,均有 f ( a b ) = f ( a ) f ( b ) f(ab) = f(a)f(b) f ( ab ) = f ( a ) f ( b ) ,则称 f f f 为 积性函数 。f ( 1 ) = 1 f(1) = 1 f ( 1 ) = 1 是必要条件。
完全积性函数:若对任意 a , b ∈ N + a, b\in \mathbb{N} ^ {+} a , b ∈ N + ,均有 f ( a b ) = f ( a ) f ( b ) f(ab) = f(a)f(b) f ( ab ) = f ( a ) f ( b ) ,则称 f f f 为 完全积性函数 。完全积性函数是积性函数。
数论函数的 加法 :对数论函数 f , g f, g f , g ,f + g f + g f + g 表示 f f f 和 g g g 的对应位置相加,即 ( f + g ) ( x ) = f ( x ) + g ( x ) (f + g)(x) = f(x) + g(x) ( f + g ) ( x ) = f ( x ) + g ( x ) 。
数论函数的 数乘 :对数 c c c 和数论函数 f f f ,c ⋅ f c\cdot f c ⋅ f 表示 f f f 的各个位置乘 c c c ,即 ( c ⋅ f ) ( x ) = c ⋅ f ( x ) (c\cdot f)(x) = c \cdot f(x) ( c ⋅ f ) ( x ) = c ⋅ f ( x ) 。一般记为 c f cf c f 。积性函数的数乘不是积性函数 (考虑 f ( 1 ) = 1 f(1) = 1 f ( 1 ) = 1 的必要条件)。
数论函数的 点乘 :对数论函数 f , g f, g f , g ,f ⋅ g f \cdot g f ⋅ g 表示 f f f 和 g g g 的对应位置相乘,即 ( f ⋅ g ) ( x ) = f ( x ) g ( x ) (f \cdot g)(x) = f(x)g(x) ( f ⋅ g ) ( x ) = f ( x ) g ( x ) 。一般记为 f g fg f g 。两个积性函数的点乘是积性函数 。
积性函数是这篇博客的主角。为什么它如此重要呢?因为积性函数由它在质数幂处的取值完全确定。给定
n n n ,计算
n n n 在唯一分解下每个质数幂处
f f f 的取值,就能得到
f ( n ) f(n) f ( n ) 。
关于常见积性函数,见 2.2 小节。
积性函数的性质在数论函数和质因数分解之间建立了桥梁,于是很多积性函数的筛法都和质因数分解当中最基本的元素——质数息息相关。因此,我们首先需要学习质数筛法。
1. 质数筛法
质数筛法是数论函数体系当中最基本的知识点,也是大部分数论题目所必需的算法。
质数判定的基本想法是寻找合数满足的性质,并证明质数不满足这些性质。从合数满足的性质出发,得到判定合数的必要条件(取否定,即判定质数的充分条件),再考虑证明其充分性。
关于更快速的质数判定,见质因数分解笔记的 Miller-Rabin。
1.1 基本算法
1.1.1 试除法
如果
n n n 是合数,那么存在因数
d ∈ [ 2 , n − 1 ] d\in [2, n - 1] d ∈ [ 2 , n − 1 ] 。如果
d ≥ n d \geq \sqrt n d ≥ n ,那么
n / d n / d n / d 也是非平凡因数且
n / d ≤ n n / d \leq \sqrt n n / d ≤ n 。
因此,如果
n n n 是合数,那么存在因数
d ∈ [ 2 , n ] d\in [2, \sqrt n] d ∈ [ 2 , n ] 。反过来,如果存在这样的
d d d ,那么
n n n 显然是合数。
时间
O ( n ) \mathcal{O}(\sqrt n) O ( n ) 。
1.1.2 倍数筛
如果直接对每个数使用试除法,则时间复杂度
O ( n n ) \mathcal{O}(n\sqrt n) O ( n n ) 。
我们希望找到因数-倍数关系判定质数。试除法的问题在于,对于每个倍数,难以快速求出其所有因数,导致枚举了太多不是因数的数。但对于一个因数,我们很容易找到其所有倍数。这引出了接下来的倍数筛。
如果
x x x 是合数,那么存在非平凡因数
d d d 。相反,如果
x x x 是质数,那么不存在这样的
d d d 。
如果
d ∈ [ 2 , x − 1 ] d\in [2, x - 1] d ∈ [ 2 , x − 1 ] 是
x x x 的因数,那么存在
k > 1 k > 1 k > 1 使得
x = k d x = kd x = k d 。于是,我们用一个数的不是它自己的倍数标记出合数。
枚举
2 ∼ n 2\sim n 2 ∼ n 的所有数
x x x ,并将
2 x , 3 x , ⋯ 2x, 3x, \cdots 2 x , 3 x , ⋯ 标记为合数,直到
k x > n kx > n k x > n 。过程结束后没有被标记的数就是质数。
时间
O ( ∑ i = 1 n n / i ) = O ( n ln n ) \mathcal{O}(\sum_{i = 1} ^ n n / i) = \mathcal{O}(n\ln n) O ( ∑ i = 1 n n / i ) = O ( n ln n ) 。
1.1.3 区间筛
在倍数筛的过程中,如果
x x x 有非平凡因数
d d d ,那么
d d d 和
x / d x / d x / d 一定有一个不超过
x \sqrt x x 。因此,仅使用
[ 2 , x ] [2, \sqrt x] [ 2 , x ] 筛去所有合数即可。
推广到本题,就是仅使用
[ 2 , r ] [2, \sqrt r] [ 2 , r ] 的每个数标记
l , r l, r l , r 之间的合数。
时间
O ( ( r − l ) ln r + r ) \mathcal{O}((r - l)\ln r + \sqrt r) O (( r − l ) ln r + r ) 。
1.2 埃氏筛
由算术基本定理,如果
x x x 是合数,那么存在
质因数 d ∈ [ 2 , x − 1 ] d\in [2, x - 1] d ∈ [ 2 , x − 1 ] 。相反,如果
x x x 是质数,那么不存在这样的
d d d 。基于此,埃氏筛用
已经筛出的质数 的倍数标记合数。
算法流程:从 2 2 2 到 n n n 枚举所有数 x x x 。若 x x x 没有被标记,则 x x x 是质数,并将 x x x 的除了本身的倍数标记为合数。
小优化:因为合数的最小质因数不超过其平方根,所以我们可以从 x 2 x ^ 2 x 2 开始标记,不影响复杂度。这个思想很重要,因为外层只需枚举到 n \sqrt n n 。埃氏筛提供了亚线性计算特殊积性函数的框架:考虑如何在每一轮中加入新标记的合数的贡献。
代码如下:
CPP for (int i = 2 ; i < N; i++) {
if (!vis[i]) {
pr[++cnt] = i;
for (int j = i + i; j < N; j += i) vis[j] = 1 ;
}
}
复杂度证明
结论(质数倒数和的数量级)
不超过
n n n 的质数的倒数之和是
O ( log log n ) \mathcal{O}(\log\log n) O ( log log n ) 。
证明
每个数只会被其质因数标记到,所以
∑ p ∈ P , p ≤ n n p = ∑ p ∈ P , p ≤ n ( ⌊ n p ⌋ + O ( 1 ) ) = ∑ i = 1 n ω ( i ) + O ( n ) , \sum_{p\in \mathbb{P},\ p\leq n} \frac n p = \sum_{p\in \mathbb{P},\ p\leq n} \left(\left\lfloor\frac n p\right\rfloor + \mathcal{O}(1)\right) = \sum_{i = 1} ^ n \omega(i) + \mathcal{O}(n), p ∈ P , p ≤ n ∑ p n = p ∈ P , p ≤ n ∑ ( ⌊ p n ⌋ + O ( 1 ) ) = i = 1 ∑ n ω ( i ) + O ( n ) ,
即
∑ p ∈ P , p ≤ n 1 p = 1 n ∑ i = 1 n ω ( i ) + O ( 1 ) . \sum_{p\in \mathbb{P},\ p\leq n} \frac 1 p = \frac 1 n \sum_{i = 1} ^ n \omega(i) + \mathcal{O}(1). p ∈ P , p ≤ n ∑ p 1 = n 1 i = 1 ∑ n ω ( i ) + O ( 1 ) .
∑ i = 1 n 2 ω ( i ) ≤ ∑ i = 1 n d ( i ) = O ( n log n ) . \sum_{i = 1} ^ n 2 ^ {\omega(i)} \leq \sum_{i = 1} ^ n d(i) = \mathcal{O}(n\log n). i = 1 ∑ n 2 ω ( i ) ≤ i = 1 ∑ n d ( i ) = O ( n log n ) .
根据
2 x 2 ^ x 2 x 的凸性和 Jensen 不等式(琴生不等式),得
2 ∑ i = 1 n ω ( i ) n ≤ 1 n ∑ i = 1 n 2 ω ( i ) = O ( log n ) . 2 ^ {\frac{\sum_{i = 1} ^ n \omega(i)} n} \leq\frac 1 n\sum_{i = 1} ^ n 2 ^ {\omega(i)} = \mathcal{O}(\log n). 2 n ∑ i = 1 n ω ( i ) ≤ n 1 i = 1 ∑ n 2 ω ( i ) = O ( log n ) .
取对数,
∑ p ∈ P , p ≤ n 1 p = 1 n ∑ i = 1 n ω ( i ) + O ( 1 ) = O ( log log n ) . \sum_{p\in \mathbb{P},\ p\leq n} \frac 1 p = \frac 1 n \sum_{i = 1} ^ n \omega(i) + \mathcal{O}(1) = \mathcal{O}(\log \log n). p ∈ P , p ≤ n ∑ p 1 = n 1 i = 1 ∑ n ω ( i ) + O ( 1 ) = O ( log log n ) .
因此,埃氏筛的时间为
O ( n log log n ) \mathcal{O}(n\log\log n) O ( n log log n ) 。
1.3 线性筛
线性筛也称欧拉 Euler 筛。
埃氏筛用质数的倍数筛去合数,导致一个合数会被它的多个质因数筛到。如果让每个合数只被筛一次,就可以做到线性了。
考虑用每个合数的
最小质因数 筛去它。设当前筛到
i i i ,有两种思路:
一是当 i i i 是质数时,筛去最小质因数是 i i i 的合数,即求出所有 j j j 使得 i j ij ij 的最小质因数为 i i i 。这要求 j j j 的最小质因数不小于 i i i ,也就是当前还没有被标记的所有数。可以用链表维护,但是较麻烦。
二是对每个 i i i ,筛去除掉最小质因数 j j j 之后的值等于 i i i 的合数。这要求 j j j 不大于 i i i 的最小质因数,因此 j j j 只能是所有不大于 i i i 的最小质因数的质数。从小到大枚举质数 j j j ,直到 j j j 等于 i i i 的最小质因数时退出,判定条件是 j ∣ i j\mid i j ∣ i 。
显然采用第二种思路。
另一种理解方式是,对于每个
i i i ,设其最小质因数为
p p p ,则对于不大于
p p p 的质数
q q q ,
i q iq i q 的最小质因数为
q q q 。将所有
i q iq i q 标记为合数,则每个合数
c c c 仅在
i = c / q i = c / q i = c / q 时以
i q iq i q 的形式被删去,其中
q q q 是
c c c 的最小质因数。
综上,得到如下算法。从
2 2 2 到
n n n 枚举
i i i :
从小到大遍历当前筛出的所有素数
p r j pr_j p r j ,要求
i ⋅ p r j i\cdot pr_j i ⋅ p r j 的最小质因数为
p r j pr_j p r j 。将
i ⋅ p r j i\cdot pr_j i ⋅ p r j 标记为合数。
若
p r j ∣ i pr_j\mid i p r j ∣ i ,则退出遍历。再往下枚举,对应的最小质因数就不是我们想要的了:因为
p r j ∣ i pr_j\mid i p r j ∣ i ,所以对于
k > j k > j k > j ,
p r j ∣ i ⋅ p r k pr_j \mid i\cdot pr_k p r j ∣ i ⋅ p r k 。
i ⋅ p r k i\cdot pr_k i ⋅ p r k 的最小质因数是
p r j pr_j p r j ,而非
p r k pr_k p r k 。
时间
O ( n ) \mathcal{O}(n) O ( n ) 。
模板题 代码。
CPP #include <bits/stdc++.h>
using namespace std;
constexpr int N = 1e8 + 5 ;
bool vis[N];
int n, q, pr[N / 16 ], cnt;
int main () {
cin >> n;
for (int i = 2 ; i <= n; i++) {
if (!vis[i]) pr[++cnt] = i;
for (int j = 1 ; j <= cnt && i * pr[j] <= n; j++) {
vis[i * pr[j]] = 1 ;
if (i % pr[j] == 0 ) break ;
}
}
cin >> q;
while (q--) {
int x;
scanf ("%d" , &x);
printf ("%d\n" , pr[x]);
}
return 0 ;
}
1.4 线性筛积性函数
线性筛提供了在线性时间内筛出具有特殊性质的
积性函数 在
1 ∼ n 1\sim n 1 ∼ n 处所有取值的基本框架。
只要可以在
O ( 1 ) \mathcal{O}(1) O ( 1 ) 时间内计算积性函数
f f f 在任意质数幂处的取值
f ( p k ) f(p ^ k) f ( p k ) ,就可以线性筛出
f f f 在
1 ∼ n 1\sim n 1 ∼ n 处的所有取值。
注意 :这只是
f f f 可线性筛的充分条件。存在更弱的条件使得
f f f 可线性筛,见 2.2 小节。
根据积性函数的性质,考虑求出
l i l_i l i 表示
i i i 的最小质因数
p p p 的最高次幂
p ν p ( i ) p ^ {\nu_p(i)} p ν p ( i ) 。若
i i i 是质数幂,则直接计算,否则
l i ≠ i l_i\neq i l i = i ,
f ( i ) = f ( l i ) f ( i / l i ) f(i) = f(l_i) f(i / l_i) f ( i ) = f ( l i ) f ( i / l i ) 。
CPP for (int i = 2 ; i < N; i++) {
if (!vis[i]) pr[++cnt] = i, f[i] = ..., low[i] = i;
for (int j = 1 ; j <= cnt && i * pr[j] < N; j++) {
vis[i * pr[j]] = 1 ;
if (i % pr[j] == 0 ) {
low[i * pr[j]] = low[i] * pr[j];
if (i == low[i]) f[i * pr[j]] = ...;
else f[i * pr[j]] = f[i / low[i]] * f[low[i * pr[j]]];
break ;
}
low[i * pr[j]] = pr[j];
f[i * pr[j]] = f[i] * f[pr[j]];
}
}
2. 狄利克雷卷积
狄利克雷 Dirichlet 卷积是数论函数的基本运算。
2.1 定义
我们知道加法卷积
c k = ∑ i + j = k a i b j . c_k = \sum_{i + j = k} a_ib_j. c k = i + j = k ∑ a i b j .
但加法卷积不保留积性。将加法换成乘法,结果如何?
h ( n ) = ∑ d d ′ = n f ( d ) g ( d ′ ) h(n) = \sum_{dd' = n} f(d) g(d') h ( n ) = d d ′ = n ∑ f ( d ) g ( d ′ )
称为
狄利克雷卷积 ,记为
h = f ∗ g h = f * g h = f ∗ g 。按照定义式计算狄利克雷卷积,时间为调和级数的
O ( n log n ) \mathcal{O}(n\log n) O ( n log n ) 。
狄利克雷卷积的另一种更常见的形式为
h ( n ) = ∑ d ∣ n f ( d ) g ( n d ) . h(n) = \sum_{d\mid n} f(d) g\left(\frac n d\right). h ( n ) = d ∣ n ∑ f ( d ) g ( d n ) .
2.2 常见数论函数
设
n n n 的唯一分解为
∏ i = 1 m p i c i \prod_{i = 1} ^ m p_i ^ {c_i} ∏ i = 1 m p i c i ,以下列出了一些常见的积性函数。除了
ω \omega ω 是加性函数以外,其余所有函数都是积性函数。
单位函数
ϵ ( n ) = [ n = 1 ] . \epsilon(n) = [n = 1]. ϵ ( n ) = [ n = 1 ] .
当
n = 1 n = 1 n = 1 时取值为
1 1 1 ,否则为
0 0 0 。
单位函数
ϵ \epsilon ϵ 是狄利克雷卷积的单位元。
常数函数
1 ( n ) = 1. 1(n) = 1. 1 ( n ) = 1.
一个函数和常数函数的狄利克雷卷积称为狄利克雷前缀和,其结果函数在
n n n 处的取值为原函数在
n n n 的所有因数处的取值和。
恒等函数
i d ( n ) = n . \mathrm{id}(n) = n. id ( n ) = n .
所有位置的取值均为本身。更一般地,
i d k ( n ) = n k . \mathrm{id}_k(n) = n ^ k. id k ( n ) = n k .
除数函数
σ k ( n ) = ∑ d ∣ n d k . \sigma_k(n) = \sum_{d\mid n}d ^ k. σ k ( n ) = d ∣ n ∑ d k .
σ 0 ( n ) \sigma_0(n) σ 0 ( n ) 表示
n n n 的因数个数,记为
d ( n ) d(n) d ( n ) 。
σ 1 ( n ) \sigma_1(n) σ 1 ( n ) 表示
n n n 的因数和,记为
σ ( n ) \sigma(n) σ ( n ) 。
σ k ( n ) \sigma_k(n) σ k ( n ) 有计算式
{ ∏ i = 1 m ( c i + 1 ) , k = 0 ; ∏ i = 1 m p i ( c i + 1 ) k − 1 p i − 1 , k > 0. \begin{cases}
\prod_{i = 1} ^ m (c_i + 1), & k = 0; \\
\prod_{i = 1} ^ m \frac{p_i ^ {(c_i + 1)k} - 1}{p_i - 1}, & k > 0.
\end{cases} { ∏ i = 1 m ( c i + 1 ) , ∏ i = 1 m p i − 1 p i ( c i + 1 ) k − 1 , k = 0 ; k > 0.
根据乘法分配律,
σ k ( n ) \sigma_k(n) σ k ( n ) 也就是
n n n 的所有因数的
k k k 次方之和可写作
∏ i = 1 m ( 1 + p i k + p i 2 k + ⋯ + p i c i k ) . \prod_{i = 1} ^ m(1 + p_i ^ k + p_i ^ {2k} + \cdots + p_i ^ {c_ik}). i = 1 ∏ m ( 1 + p i k + p i 2 k + ⋯ + p i c i k ) .
等比数列求和即可。
欧拉函数
φ ( n ) = ∑ i = 0 n − 1 [ i ⊥ n ] . \varphi(n) = \sum_{i = 0} ^ {n - 1} [i\perp n]. φ ( n ) = i = 0 ∑ n − 1 [ i ⊥ n ] .
0 ∼ n − 1 0\sim n - 1 0 ∼ n − 1 中与
n n n 互质的数的个数。
关于欧拉函数,见第四章。
本质不同质因数函数
ω ( n ) = ∑ p ∈ P [ p ∣ n ] . \omega(n) = \sum_{p \in \mathbb{P}} [p\mid n]. ω ( n ) = p ∈ P ∑ [ p ∣ n ] .
莫比乌斯函数
μ ( n ) = { 1 , n = 1 ; 0 , ∃ d > 1 , d 2 ∣ n ; ( − 1 ) ω ( n ) , o t h e r w i s e . \mu(n) =
\begin{cases}
1, & n = 1; \\
0, & \exists d > 1, d ^ 2\mid n; \\
(-1) ^ {\omega(n)}, & \mathrm{otherwise}.
\end{cases} μ ( n ) = ⎩ ⎨ ⎧ 1 , 0 , ( − 1 ) ω ( n ) , n = 1 ; ∃ d > 1 , d 2 ∣ n ; otherwise .
若
n n n 有大于
1 1 1 的平方因数,那么
μ ( n ) = 0 \mu(n) = 0 μ ( n ) = 0 ,否则
μ ( n ) = ( − 1 ) ω ( n ) \mu(n) = (-1) ^ {\omega(n)} μ ( n ) = ( − 1 ) ω ( n ) 。
莫比乌斯函数是常函数的狄利克雷卷积逆元,在数论函数与筛法中有着重要地位。关于莫比乌斯函数和莫比乌斯反演,见第五章。
2.3 性质
最基本的交换律,结合律与分配律。
性质 1.1(交换律)
狄利克雷卷积有 交换律 。
证明
( f ∗ g ) ( n ) = ∑ d d ′ = n f ( d ) g ( d ′ ) . \begin{aligned}
(f * g)(n) & = \sum_{dd' = n} f(d) g(d').
\end{aligned} ( f ∗ g ) ( n ) = d d ′ = n ∑ f ( d ) g ( d ′ ) .
d , d ′ d, d' d , d ′ 的地位相同。交换
d d d 和
d ′ d' d ′ ,可知
f ∗ g = g ∗ f f * g = g * f f ∗ g = g ∗ f 。
□ \square □
性质 1.2(结合律)
狄利克雷卷积有 结合律 。
证明
( ( f ∗ g ) ∗ h ) ( n ) = ∑ d d ′ d ′ ′ = n f ( d ) g ( d ′ ) h ( d ′ ′ ) . \begin{aligned}
((f * g) * h)(n) & = \sum_{dd'd'' = n} f(d) g(d') h(d'').
\end{aligned} (( f ∗ g ) ∗ h ) ( n ) = d d ′ d ′′ = n ∑ f ( d ) g ( d ′ ) h ( d ′′ ) .
d , d ′ , d ′ ′ d, d', d'' d , d ′ , d ′′ 的地位相同。先结合
d ′ d' d ′ 和
d ′ ′ d'' d ′′ ,可知
( f ∗ g ) ∗ h = f ∗ ( g ∗ h ) (f * g) * h = f * (g * h) ( f ∗ g ) ∗ h = f ∗ ( g ∗ h ) 。
□ \square □
性质 1.3(分配律)
狄利克雷卷积有 分配律 。
证明
( ( f + g ) ∗ h ) ( n ) = ∑ d d ′ = n ( f ( d ) + g ( d ) ) h ( d ′ ) = ∑ d d ′ = n f ( d ) h ( d ′ ) + ∑ d d ′ = n g ( d ) h ( d ′ ) = ( f ∗ h + g ∗ h ) ( n ) . \begin{aligned}
((f + g) * h)(n) & = \sum_{dd' = n} (f(d) + g(d)) h(d') \\
& = \sum_{dd' = n} f(d)h(d') + \sum_{dd' = n} g(d)h(d') \\
& = (f * h + g * h)(n).
\end{aligned} (( f + g ) ∗ h ) ( n ) = d d ′ = n ∑ ( f ( d ) + g ( d )) h ( d ′ ) = d d ′ = n ∑ f ( d ) h ( d ′ ) + d d ′ = n ∑ g ( d ) h ( d ′ ) = ( f ∗ h + g ∗ h ) ( n ) .
因此
( f + g ) ∗ h = f ∗ h + g ∗ h (f + g) * h = f * h + g * h ( f + g ) ∗ h = f ∗ h + g ∗ h 。
□ \square □
注意 :点积和狄利克雷卷积之间不具有交换律。
( f ⋅ g ) ∗ h ≠ ( f ∗ h ) ⋅ g (f\cdot g) * h \neq (f * h) \cdot g ( f ⋅ g ) ∗ h = ( f ∗ h ) ⋅ g 。
考察卷积的单位元。容易发现:
性质 2(单位元)
ϵ ∗ f = f \epsilon * f = f ϵ ∗ f = f 。
证明
考虑
( ϵ ∗ f ) ( n ) (\epsilon * f)(n) ( ϵ ∗ f ) ( n ) 的计算式,只有
f ( n ) f(n) f ( n ) 这一项非零。所以
( ϵ ∗ f ) ( n ) = f ( n ) (\epsilon * f)(n) = f(n) ( ϵ ∗ f ) ( n ) = f ( n ) 。
□ \square □
单位函数
ϵ \epsilon ϵ 是狄利克雷卷积的
单位元 。这也是其名称的由来。
在单位元的基础上,定义狄利克雷卷积的逆元
f − 1 f ^ {-1} f − 1 ,满足
f ∗ f − 1 = f − 1 ∗ f = ϵ f * f ^ {-1} = f ^ {-1} * f = \epsilon f ∗ f − 1 = f − 1 ∗ f = ϵ 。
性质 3(逆元)
f f f 可逆当且仅当
f ( 1 ) ≠ 0 f(1)\neq 0 f ( 1 ) = 0 。
证明
设
g = f − 1 g = f ^ {-1} g = f − 1 。
当 f ( 1 ) = 0 f(1) = 0 f ( 1 ) = 0 时,f ( 1 ) g ( 1 ) = 0 ≠ ϵ ( 1 ) f(1)g(1) = 0\neq \epsilon(1) f ( 1 ) g ( 1 ) = 0 = ϵ ( 1 ) 。所以无论如何 g g g 都不存在。
当 f ( 1 ) ≠ 0 f(1) \neq 0 f ( 1 ) = 0 时,g ( 1 ) = 1 f ( 1 ) g(1) = \frac 1 {f(1)} g ( 1 ) = f ( 1 ) 1 。
对于
n > 1 n > 1 n > 1 ,通过
∑ d ∣ n g ( d ) f ( n / d ) = 0 \sum_{d\mid n} g(d)f(n / d) = 0 ∑ d ∣ n g ( d ) f ( n / d ) = 0 得到递推式
g ( n ) = − ∑ d ∣ n ∧ d ≠ n g ( d ) f ( n / d ) f ( 1 ) . g(n) = -\frac{\sum_{d \mid n \land d \neq n} g(d)f(n / d)} {f(1)}. g ( n ) = − f ( 1 ) ∑ d ∣ n ∧ d = n g ( d ) f ( n / d ) .
计算逆元的时间也是
O ( n log n ) \mathcal{O}(n\log n) O ( n log n ) 。
性质 3 说明只要
g ( 1 ) ≠ 0 g(1) \neq 0 g ( 1 ) = 0 ,就可以计算除法
f ∗ g − 1 f * g ^ {-1} f ∗ g − 1 。
性质 4(消去律)
f = g f = g f = g 当且仅当存在
h h h 使得
h ( 1 ) ≠ 0 h(1)\neq 0 h ( 1 ) = 0 且
f ∗ h = g ∗ h f * h = g * h f ∗ h = g ∗ h 。
证明
充分性 :
f ∗ h = g ∗ h ⟹ f ∗ h ∗ h − 1 = g ∗ h ∗ h − 1 ⟹ f = g f * h = g * h\implies f * h * h ^ {-1} = g * h * h ^ {-1} \implies f = g f ∗ h = g ∗ h ⟹ f ∗ h ∗ h − 1 = g ∗ h ∗ h − 1 ⟹ f = g 。
必要性 :
f = g ⟹ f ∗ ϵ = g ∗ ϵ f = g\implies f * \epsilon = g * \epsilon f = g ⟹ f ∗ ϵ = g ∗ ϵ 。
□ \square □
等式两侧同时卷相同的可逆数论函数,等式仍然成立。
性质 5(乘法保留积性)
积性函数的狄利克雷卷积是积性函数 。
证明
考虑积性函数
f f f 和
g g g 的狄利克雷卷积
h h h 。
若
n ⊥ m n\perp m n ⊥ m ,则对于任意
d 1 ∣ n d_1\mid n d 1 ∣ n 和
d 2 ∣ m d_2\mid m d 2 ∣ m ,
d 1 ⊥ d 2 d_1\perp d_2 d 1 ⊥ d 2 。因此,
h ( n ) h ( m ) = ( ∑ d 1 d 1 ′ = n f ( d 1 ) g ( d 1 ′ ) ) ( ∑ d 2 d 2 ′ = m f ( d 2 ) g ( d 2 ′ ) ) = ∑ d d ′ = n m f ( d ) g ( d ′ ) ( d = d 1 d 2 ) = h ( n m ) . \begin{aligned}
h(n)h(m) & = \left(\sum_{d_1d_1' = n} f(d_1) g(d_1' )\right)\left(\sum_{d_2d_2' = m} f(d_2) g(d_2')\right) \\
& = \sum_{dd' = nm} f(d) g(d') & (d = d_1d_2) \\
& = h(nm).
\end{aligned} h ( n ) h ( m ) = d 1 d 1 ′ = n ∑ f ( d 1 ) g ( d 1 ′ ) d 2 d 2 ′ = m ∑ f ( d 2 ) g ( d 2 ′ ) = d d ′ = nm ∑ f ( d ) g ( d ′ ) = h ( nm ) . ( d = d 1 d 2 )
第二步用到了两个条件:
f , g f, g f , g 是积性函数。f ( d 1 ) f ( d 2 ) = f ( d 1 d 2 ) = f ( d ) f(d_1) f(d_2) = f(d_1d_2) = f(d) f ( d 1 ) f ( d 2 ) = f ( d 1 d 2 ) = f ( d ) ,g ( d 1 ′ ) g ( d 2 ′ ) = g ( d ′ ) g(d_1')g(d_2') = g(d') g ( d 1 ′ ) g ( d 2 ′ ) = g ( d ′ ) 。
d d d 和 ( d 1 , d 2 ) (d_1, d_2) ( d 1 , d 2 ) 二元组一一对应(需要使用 n ⊥ m n\perp m n ⊥ m 的条件)。给定 ( d 1 , d 2 ) (d_1, d_2) ( d 1 , d 2 ) ,d = d 1 d 2 d = d_1d_2 d = d 1 d 2 。给定 d d d ,d 1 = gcd ( d , n ) d_1 = \gcd(d, n) d 1 = g cd( d , n ) ,d 2 = gcd ( d , m ) d_2 = \gcd(d, m) d 2 = g cd( d , m ) 。
性质 5 很重要。它说明 狄利克雷卷积保留积性 。
性质 6(除法保留积性)
积性函数的狄利克雷卷积逆元是积性函数。
证明
证明来自 OI-Wiki。
设
g = f − 1 g = f ^ {-1} g = f − 1 。回忆积性函数
f f f 一定满足
f ( 1 ) = 1 f(1) = 1 f ( 1 ) = 1 。
根据
f f f 的积性可知
g ( 1 ) = 1 f ( 1 ) = 1 g(1) = \frac 1 {f(1)} = 1 g ( 1 ) = f ( 1 ) 1 = 1 ,所以
g ( n ) = g ( 1 ) g ( n ) g(n) = g(1) g(n) g ( n ) = g ( 1 ) g ( n ) 。
对于
n , m > 1 n, m > 1 n , m > 1 且
n ⊥ m n\perp m n ⊥ m ,假设对任意
x y < n m xy < nm x y < nm 且
x ⊥ y x\perp y x ⊥ y ,均有
g ( x y ) = g ( x ) g ( y ) g(xy) = g(x)g(y) g ( x y ) = g ( x ) g ( y ) 。
当
n = 1 n = 1 n = 1 或
m = 1 m = 1 m = 1 时,命题显然成立。因此,只需证明
g ( n m ) = g ( n ) g ( m ) g(nm) = g(n)g(m) g ( nm ) = g ( n ) g ( m ) 。
g ( n m ) = − ∑ d d ′ = n m ∧ d ≠ n m g ( d ) f ( d ′ ) = − ∑ d 1 d 1 ′ = n ∧ d 2 d 2 ′ = m ∧ d 1 d 2 ≠ n m g ( d 1 ) g ( d 2 ) f ( d 1 ′ ) f ( d 2 ′ ) = f ( 1 ) 2 g ( n ) g ( m ) − ∑ d 1 d 1 ′ = n ∧ d 2 d 2 ′ = m g ( d 1 ) g ( d 2 ) f ( d 1 ′ ) f ( d 2 ′ ) = g ( n ) g ( m ) − ( ∑ d 1 d 1 ′ = n g ( d 1 ) f ( d 1 ′ ) ) ( ∑ d 2 d 2 ′ = m g ( d 2 ) f ( d 2 ′ ) ) = g ( n ) g ( m ) − ϵ ( n ) − ϵ ( m ) = g ( n ) g ( m ) . \begin{aligned}
g(nm) & = -\sum_{d d' = nm\land d\neq nm} g(d)f(d') \\
& = -\sum_{d_1d_1' = n\land d_2d_2' = m\land d_1d_2 \neq nm} g(d_1) g(d_2) f(d_1')f(d_2') \\
& = f(1) ^ 2 g(n) g(m) -\sum_{d_1d_1' = n \land d_2d_2' = m} g(d_1) g(d_2) f(d_1') f(d_2') \\
& = g(n)g(m) - \left(\sum_{d_1d_1' = n} g(d_1) f(d_1')\right) \left( \sum_{d_2d_2' = m} g(d_2) f(d_2')\right) \\
& = g(n)g(m) - \epsilon(n) - \epsilon(m) \\
& = g(n)g(m).
\end{aligned} g ( nm ) = − d d ′ = nm ∧ d = nm ∑ g ( d ) f ( d ′ ) = − d 1 d 1 ′ = n ∧ d 2 d 2 ′ = m ∧ d 1 d 2 = nm ∑ g ( d 1 ) g ( d 2 ) f ( d 1 ′ ) f ( d 2 ′ ) = f ( 1 ) 2 g ( n ) g ( m ) − d 1 d 1 ′ = n ∧ d 2 d 2 ′ = m ∑ g ( d 1 ) g ( d 2 ) f ( d 1 ′ ) f ( d 2 ′ ) = g ( n ) g ( m ) − d 1 d 1 ′ = n ∑ g ( d 1 ) f ( d 1 ′ ) d 2 d 2 ′ = m ∑ g ( d 2 ) f ( d 2 ′ ) = g ( n ) g ( m ) − ϵ ( n ) − ϵ ( m ) = g ( n ) g ( m ) .
最后一步的依据是
n , m > 1 n, m > 1 n , m > 1 。
□ \square □
性质 5 和性质 6 告诉我们:积性函数的狄利克雷卷积与狄利克雷卷积逆是积性函数 。
注意 :积性函数的和与差不是积性函数。
2.4 线性筛狄利克雷卷积
根据积性函数的狄利克雷卷积是积性函数的结论,考虑使用线性筛筛出
h = f ∗ g h = f * g h = f ∗ g ,其中
f , g f, g f , g 是积性函数。
h ( n ) = { 1 , n = 1 ; ∑ c = 0 k f ( p c ) g ( p k − c ) , n = p k ; h ( p k ) h ( m ) , n = p k m ( m > 1 ∧ p ∤ m ) . h(n) =
\begin{cases}
1, & n = 1; \\
\sum_{c = 0} ^ k f(p ^ c)g(p ^ {k - c}), & n = p ^ k; \\
h(p ^ k)h(m), & n = p ^ k m \ (m > 1\land p\nmid m).
\end{cases} h ( n ) = ⎩ ⎨ ⎧ 1 , ∑ c = 0 k f ( p c ) g ( p k − c ) , h ( p k ) h ( m ) , n = 1 ; n = p k ; n = p k m ( m > 1 ∧ p ∤ m ) .
对于第一种情况和第三种情况,使用 1.4 线性筛积性函数的技巧直接计算。
关键在于第二种情况。若已知
f , g f, g f , g 在质数幂处的取值,则需要
O ( k ) \mathcal{O}(k) O ( k ) 的时间。
当 f f f 是完全积性函数时,h ( p k ) = f ( p ) h ( p k − 1 ) + g ( p k ) h(p ^ k) = f(p)h(p ^ {k - 1}) + g(p ^ k) h ( p k ) = f ( p ) h ( p k − 1 ) + g ( p k ) ,可以 O ( 1 ) \mathcal{O}(1) O ( 1 ) 计算。对于 g g g 同理。
尝试估计第二种情况的复杂度
T ( n ) T(n) T ( n ) 。证明来自 EI。
所有不大于
n k \sqrt[k] n k n 的质数产生
O ( k ) \mathcal{O}(k) O ( k ) 的贡献,因此
T ( n ) = ∑ x = 1 log n x π ( ⌊ n x ⌋ ) ≈ ∑ x = 1 log n x n x ln n x = 1 ln n ∑ x = 1 log n x 2 n x . T(n) = \sum_{x = 1} ^ {\log n} x\pi(\lfloor\sqrt[x]n\rfloor) \approx \sum_{x = 1} ^ {\log n} \frac {x\sqrt[x] n}{\ln \sqrt[x] n} = \frac 1 {\ln n} \sum\limits_{x = 1} ^ {\log n} x ^ 2\sqrt[x] n. T ( n ) = x = 1 ∑ l o g n x π (⌊ x n ⌋) ≈ x = 1 ∑ l o g n ln x n x x n = ln n 1 x = 1 ∑ l o g n x 2 x n .
当
x = 1 x = 1 x = 1 时,
x 2 n x = n x ^ 2\sqrt[x] {n} = n x 2 x n = n 。
当
2 ≤ x ≤ log n 2\leq x\leq \log n 2 ≤ x ≤ log n 时,因为
x 2 x ^ 2 x 2 递增,
n x \sqrt [x] {n} x n 递减,所以
x 2 n x ≤ ( log 2 2 n ) ⋅ n = O ( n ) . x ^ 2\sqrt[x]{n} \leq (\log_2 ^ 2 n) \cdot\sqrt n = \mathcal{O}(n). x 2 x n ≤ ( log 2 2 n ) ⋅ n = O ( n ) .
因此
T ( n ) = 1 ln n ∑ i = 1 log 2 n O ( n ) = O ( n ) . T(n) = \frac 1 {\ln n} \sum_{i = 1} ^ {\log_2 n} \mathcal{O}(n) = \mathcal{O}(n). T ( n ) = ln n 1 i = 1 ∑ l o g 2 n O ( n ) = O ( n ) .
使用线性筛求出两个
在质数幂处取值已知 的积性函数的狄利克雷卷积在
1 ∼ n 1\sim n 1 ∼ n 处的取值的时间复杂度为
O ( n ) \mathcal{O}(n) O ( n ) 。这给出了积性函数可线性筛的更弱条件:在
O ( k ) \mathcal{O}(k) O ( k ) 的时间内计算质数幂处的取值。
2.5 狄利克雷前缀和
前置知识 :高维前缀和。
任意数论函数
f f f 与常数函数
1 1 1 卷积得到
g g g 。称
g = f ∗ 1 g = f * 1 g = f ∗ 1 为
f f f 的
狄利克雷前缀和 ,则
g ( n ) = ∑ d ∣ n f ( d ) . g(n) = \sum_{d\mid n} f(d). g ( n ) = d ∣ n ∑ f ( d ) .
狄利克雷前缀和用途广泛,因为对每个
n n n 计算给定数论函数在其所有因数处的取值之和有良好的实际含义。其逆运算为狄利克雷差分,相当于
f ∗ μ f * \mu f ∗ μ ,将在第四章介绍。
将正整数
n n n 写成无穷序列
a n = { c 1 , c 2 , ⋯ , c i , ⋯ } a_n = \{c_1, c_2, \cdots, c_i, \cdots\} a n = { c 1 , c 2 , ⋯ , c i , ⋯ } ,表示
n = ∏ p i c i n = \prod p_i ^ {c_i} n = ∏ p i c i ,其中
p i p_i p i 为第
i i i 个质数。因为
x ∣ y x\mid y x ∣ y 等价于
x x x 的每个质因数的幂次不大于
y y y 的该质因数的幂次,即
∀ i , a x ( i ) ≤ a y ( i ) \forall i, a_x(i) \leq a_y(i) ∀ i , a x ( i ) ≤ a y ( i ) ,那么
n n n 的所有因数就是所有使得
0 ≤ a d ( i ) ≤ a n ( i ) 0\leq a_d(i) \leq a_n(i) 0 ≤ a d ( i ) ≤ a n ( i ) 的
d d d 。
以上分析结合乘法原理和唯一分解定理可以推出因数个数公式 d ( n ) = ∏ ( c i + 1 ) d(n) = \prod (c_i + 1) d ( n ) = ∏ ( c i + 1 ) 。
因此,
f ∗ 1 f * 1 f ∗ 1 可以看成对下标做关于其无穷序列的高维前缀和,即
g ( n ) = ∑ ∀ i , a d ( i ) ≤ a n ( i ) f ( d ) . g(n) = \sum_{\forall i, a_d(i) \leq a_n(i)} f(d). g ( n ) = ∀ i , a d ( i ) ≤ a n ( i ) ∑ f ( d ) .
根据高维前缀和,枚举每一维并将所有下标关于该维做前缀和,得到狄利克雷前缀和算法:
初始令 x i = f ( i ) x_i = f(i) x i = f ( i ) 。
按任意顺序枚举每个维度,即按任意顺序枚举不超过 n n n 的质数 p i p_i p i 。
按当前维度从小到大的顺序,将每个下标贡献至当前维度加 1 1 1 之后的对应下标,即从小到大枚举 k ∈ [ 1 , n p i ] k\in [1, \frac n {p_i}] k ∈ [ 1 , p i n ] ,将 x p i k x_{p_ik} x p i k 加上 x k x_k x k 。
最终 x x x 即为 g g g 。
因为小于
n n n 的素数倒数和为
O ( log log n ) \mathcal{O}(\log\log n) O ( log log n ) ,所以算法时间
O ( n log log n ) \mathcal{O}(n\log\log n) O ( n log log n ) 。
CPP #include <bits/stdc++.h>
using namespace std;
constexpr int N = 2e7 + 5 ;
int n;
unsigned ans, a[N], seed;
inline unsigned rd () {
seed ^= seed << 13 , seed ^= seed >> 17 , seed ^= seed << 5 ;
return seed;
}
bool vis[N];
int cnt, pr[N >> 3 ];
void sieve () {
for (int i = 2 ; i <= n; i++) {
if (!vis[i]) pr[++cnt] = i;
for (int j = 1 ; j <= cnt && i * pr[j] <= n; j++) {
vis[i * pr[j]] = 1 ;
if (i % pr[j] == 0 ) break ;
}
}
}
int main () {
cin >> n >> seed, sieve ();
for (int i = 1 ; i <= n; i++) a[i] = rd ();
for (int i = 1 ; i <= cnt; i++) {
for (int j = 1 ; j * pr[i] <= n; j++) {
a[j * pr[i]] += a[j];
}
}
for (int i = 1 ; i <= n; i++) ans ^= a[i];
cout << ans << endl;
return 0 ;
}
3. 数论分块
数论分块又称整除分块,解决下标带有整除值的和式。最基本的和式形如
∑ i = 1 n f ( i ) g ( ⌊ n i ⌋ ) . \sum_{i = 1} ^ n f(i) g\left(\left\lfloor \frac n i\right\rfloor\right). i = 1 ∑ n f ( i ) g ( ⌊ i n ⌋ ) .
数论分块的核心结论是
n n n 的不同整除值的数量级为
n \sqrt n n 。本小节将从该结论出发,介绍数论分块的基本算法以及各种扩展,如向上取整的数论分块,高维数论分块等。数论分块也是高级筛法的前置要求。
3.1 算法介绍
定义(整除值)
⌊ n i ⌋ \lfloor \frac n i\rfloor ⌊ i n ⌋ 的所有可能取值称为
n n n 的
整除值 ,其中整数
i ∈ [ 1 , n ] i\in [1, n] i ∈ [ 1 , n ] 。
首先考虑求和式:
∑ i = 1 n f ( i ) g ( ⌊ n i ⌋ ) . \sum_{i = 1} ^ n f(i) g\left(\left\lfloor \frac n i\right\rfloor\right). i = 1 ∑ n f ( i ) g ( ⌊ i n ⌋ ) .
注意求和上指标与取整式的被除数相等。本节最后会讨论不相等的情况。
我们只关心
g g g 在所有
n n n 的整除值处的取值。如果整除值的数量不多,且
f f f 的前缀和可以快速计算,则可以转换贡献形式,将原式写成若干个
g ( ⌊ n i ⌋ ) g(\lfloor \frac n i\rfloor) g (⌊ i n ⌋) 乘以一段
f f f 的和。
当
i i i 较大时,
⌊ n i ⌋ \lfloor \frac n i\rfloor ⌊ i n ⌋ 被限制在较小范围内,大部分相同。结合
min ( i , n i ) ≤ n \min(i, \frac n i) \le \sqrt n min ( i , i n ) ≤ n ,可以想到根号分治。
结论(整除值的数量)
n n n 至多有
2 ⌊ n ⌋ 2\lfloor \sqrt n\rfloor 2 ⌊ n ⌋ 个不同的整除值。
证明
当
i ≤ n i \leq \sqrt n i ≤ n 时,因为
i i i 只有
⌊ n ⌋ \lfloor \sqrt n \rfloor ⌊ n ⌋ 个,所以
⌊ n i ⌋ \lfloor \frac n i\rfloor ⌊ i n ⌋ 只有不超过
⌊ n ⌋ \lfloor \sqrt n \rfloor ⌊ n ⌋ 个不同的取整。
当
i > n i > \sqrt n i > n 时,因为
⌊ n i ⌋ ≤ n \lfloor \frac n i\rfloor \leq \sqrt n ⌊ i n ⌋ ≤ n ,所以
⌊ n i ⌋ \lfloor \frac n i\rfloor ⌊ i n ⌋ 也只有不超过
⌊ n ⌋ \lfloor \sqrt n \rfloor ⌊ n ⌋ 个不同的取值。
根据该结论,枚举
O ( n ) \mathcal{O}(\sqrt n) O ( n ) 种整除值
d d d ,求出最小和最大的
i i i 使得
⌊ n i ⌋ = d \lfloor \frac n i \rfloor = d ⌊ i n ⌋ = d ,分别记为
l , r l, r l , r ,则原式可写为
∑ d g ( d ) ∑ i = l r f ( i ) . \sum_{d} g(d) \sum_{i = l} ^ r f(i). d ∑ g ( d ) i = l ∑ r f ( i ) .
还剩一个问题:如何不重不漏地考虑所有整除值
d d d ,并算出其对应的极长区间
[ l , r ] [l, r] [ l , r ] ?
结论
给定
d d d ,使得
⌊ n i ⌋ ≥ d \lfloor \frac n i\rfloor \geq d ⌊ i n ⌋ ≥ d 的最大的正整数
i i i 为
⌊ n d ⌋ \lfloor \frac n d\rfloor ⌊ d n ⌋ 。
证明
因为
d d d 都是正整数,所以
⌊ n i ⌋ ≥ d \lfloor \frac n i\rfloor \geq d ⌊ i n ⌋ ≥ d 当且仅当
n i ≥ d \frac n i\geq d i n ≥ d ,当且仅当
i ≤ n d i\leq \frac n d i ≤ d n 。
因此,给定整除值
d d d ,
⌊ n i ⌋ = d \lfloor \frac n i\rfloor = d ⌊ i n ⌋ = d 要求
⌊ n i ⌋ ≥ d \lfloor \frac n i\rfloor \geq d ⌊ i n ⌋ ≥ d 且
⌊ n i ⌋ < d + 1 \lfloor \frac n i\rfloor < d + 1 ⌊ i n ⌋ < d + 1 ,即
⌊ n d + 1 ⌋ < i ≤ ⌊ n d ⌋ \lfloor \frac n {d + 1}\rfloor < i \leq \lfloor \frac n d\rfloor ⌊ d + 1 n ⌋ < i ≤ ⌊ d n ⌋ 。
考虑
从小到大枚举所有极长区间 。因为
⌊ n x ⌋ \lfloor \frac n x\rfloor ⌊ x n ⌋ 随着
x x x 增大而单调不增,所以相当于
从大到小枚举整除值 。第一个整除值是
n n n ,对应
l = r = 1 l = r = 1 l = r = 1 。第二大的整除值对应的
l l l 为
2 2 2 ,由此算出整除值
⌊ n 2 ⌋ \lfloor \frac n 2\rfloor ⌊ 2 n ⌋ ,继而由上述结论算出对应的
r r r 。
一般地,给定整除值
d d d 和对应的
[ l , r ] [l, r] [ l , r ] ,如果
d ≠ 1 d\neq 1 d = 1 ,那么下一个(比它小的最大的)整除值
d ′ d' d ′ 对应的区间的左端点
l ′ l' l ′ 等于
r + 1 r + 1 r + 1 ,从而算出整除值
d ′ ← ⌊ n l ′ ⌋ d' \gets \lfloor \frac n {l'}\rfloor d ′ ← ⌊ l ′ n ⌋ 和对应的
r ′ ← ⌊ n d ′ ⌋ = ⌊ n ⌊ n / l ′ ⌋ ⌋ r'\gets \lfloor \frac n {d'}\rfloor = \left \lfloor \frac n {\lfloor n / l'\rfloor}\right\rfloor r ′ ← ⌊ d ′ n ⌋ = ⌊ ⌊ n / l ′ ⌋ n ⌋ 。
注意:区间右端点一定是整除值 。
从下图可以看出,随着
x x x 增大,整除值以及对应区间的变化:当前整除值的下一个整除值是
⌊ n r + 1 ⌋ \lfloor \frac n {r + 1} \rfloor ⌊ r + 1 n ⌋ ,对应区间的左端点是
r + 1 r + 1 r + 1 。
>
若
O ( 1 ) O(1) O ( 1 ) 计算
g g g 和
f f f 的前缀和在单个整除值处的取值,则算法的时间复杂度为
O ( n ) \mathcal{O}(\sqrt n) O ( n ) 。
特别地,当求和上指标(记为
m m m )不等于被除数
n n n 的时候,和式形如
∑ i = 1 m f ( i ) g ( ⌊ n i ⌋ ) \sum_{i = 1} ^ m f(i) g(\lfloor \frac n i\rfloor) ∑ i = 1 m f ( i ) g (⌊ i n ⌋) 。
为了处理 n > m n > m n > m 的情况,r r r 应与 m m m 取较小值。
为了处理 n < m n < m n < m 的情况,当 ⌊ n i ⌋ = 0 \lfloor \frac n i\rfloor = 0 ⌊ i n ⌋ = 0 时,直接令 r ← m r\gets m r ← m 。
结论(整除值的结构)
小于
n \sqrt n n 的整除值是小于
n \sqrt n n 的所有正整数,不小于
n \sqrt n n 的整除值是所有
⌊ n i ⌋ \lfloor \frac n i\rfloor ⌊ i n ⌋ ,其中
i i i 是不超过
n \sqrt n n 的正整数。
3.2 扩展问题
数论分块的算法框架简单,有多种变形。
3.2.1 向上取整
将和式中的向下取整改成向上取整。
同样地,
⌈ n x ⌉ \lceil \frac n x\rceil ⌈ x n ⌉ 随着
x x x 增大而单调不增,所以算法框架不变,依然是从小到大考虑每段区间。只需对左边界
l l l 求出使得
⌈ n l ⌉ = ⌈ n r ⌉ \lceil\frac n l \rceil = \lceil\frac n r \rceil ⌈ l n ⌉ = ⌈ r n ⌉ 的最大的
r r r 。
设
k = ⌈ n l ⌉ k = \lceil\frac n l\rceil k = ⌈ l n ⌉ ,则要求
n r > k − 1 \frac n r > k - 1 r n > k − 1 。
n r > k − 1 ⟺ r < n k − 1 ⟺ r ≤ ⌊ n − 1 k − 1 ⌋ . \dfrac n r > k - 1 \iff r < \dfrac{n}{k - 1} \iff r\leq \left\lfloor\frac{n - 1}{k - 1}\right\rfloor. r n > k − 1 ⟺ r < k − 1 n ⟺ r ≤ ⌊ k − 1 n − 1 ⌋ .
第二步的依据是
n , k , r n, k, r n , k , r 均为正整数。因此,令
r ← ⌊ n − 1 k − 1 ⌋ r\gets \lfloor\frac{n - 1}{k - 1}\rfloor r ← ⌊ k − 1 n − 1 ⌋ 即可。
注意特判
k = 1 k = 1 k = 1 的情况,此时
r r r 需要取实际上界。
3.2.2 高维数论分块
当和式有若干下取整,形如
∑ i = 1 n ( f ( i ) ∏ j = 1 c g i ( ⌊ n j i ⌋ ) ) \sum_{i = 1} ^ n \left(f(i) \prod_{j = 1} ^ c g_i\left(\left\lfloor \dfrac {n_j} {i}\right\rfloor\right)\right) i = 1 ∑ n ( f ( i ) j = 1 ∏ c g i ( ⌊ i n j ⌋ ) )
时,只需稍作修改,令
r ← min ( n , min j = 1 c ⌊ n j ⌊ n j l ⌋ ⌋ ) , r \gets \min\left(n, \min_{j = 1} ^ c\left\lfloor \frac {n_j} {\lfloor \frac {n_j} l\rfloor}\right\rfloor\right), r ← min ( n , j = 1 min c ⌊ ⌊ l n j ⌋ n j ⌋ ) ,
也就是取所有
n j n_j n j 的下一个 “断点” 中最小的那个。
忽略
f f f 和
g i g_i g i 的计算,时间
O ( ∑ n j ) \mathcal{O}(\sum \sqrt {n_j}) O ( ∑ n j ) 。
称存在
n j n_j n j 满足
⌊ n j i ⌋ ≠ ⌊ n j i + 1 ⌋ \lfloor \frac {n_j} {i}\rfloor \neq \lfloor \frac {n_j} {i + 1}\rfloor ⌊ i n j ⌋ = ⌊ i + 1 n j ⌋ 的
i i i 为断点,则总断点数量为每个下取整式的断点数量相加(而不是相乘)。在相邻两个断点之间,对每个
n j n_j n j ,所有
⌊ n j i ⌋ \lfloor \frac {n_j} i\rfloor ⌊ i n j ⌋ 都是相等的。
3.2.3 数论分块嵌套
数论分块的嵌套,即对外层数论分块的每个整除值
d d d ,内层还要做规模为
d d d 的数论分块。常见于计算
g ( ⌊ n i ⌋ ) g(\lfloor \frac n i \rfloor) g (⌊ i n ⌋) 需要数论分块的情况,如第四章例题 P5518 的最后一部分。
写起来和普通数论分块一样,核心在于时间复杂度分析:
对小于 n \sqrt n n 的整除值,贡献为 ∫ 1 n x d x = Θ ( n 3 4 ) \int_1 ^ {\sqrt n} \sqrt {x} \mathrm{d} x = \Theta(n ^ {\frac 3 4}) ∫ 1 n x d x = Θ ( n 4 3 ) 。
对大于 n \sqrt n n 的整除值,贡献为 ∫ 1 n n x − 1 2 d x = Θ ( n 3 4 ) \int_1 ^ {\sqrt n} \sqrt n x ^ {-\frac 1 2} \mathrm{d} x = \Theta(n ^ {\frac 3 4}) ∫ 1 n n x − 2 1 d x = Θ ( n 4 3 ) 。
结论(整除值的根号和)
所有整除值的根号和在
n 3 / 4 n ^ {3 / 4} n 3/4 级别。
杜教筛的复杂度分析也用到了该结论。
我们还得到了一个有趣的结论:
n n n 的小于
n \sqrt n n 和大于
n \sqrt n n 的整除值的根号和是同阶的,虽然后者严格比前者大。算出积分,前者系数为
2 3 \frac 2 3 3 2 ,后者系数为
2 2 2 ,差了大约三倍。
3.3 例题
更多例题见第五章莫比乌斯反演。
[模拟赛] 你还没有卸载吗
给定
A 1 , B 1 , A 2 , B 2 , N A_1, B_1, A_2, B_2, N A 1 , B 1 , A 2 , B 2 , N ,求有多少
x ∈ [ 1 , N ] x\in [1, N] x ∈ [ 1 , N ] 使得
B 1 + ⌊ A 1 x ⌋ = B 2 + ⌊ A 2 x ⌋ B_1 + \lfloor\frac{A_1}{x}\rfloor = B_2 + \lfloor\frac{A_2}{x}\rfloor B 1 + ⌊ x A 1 ⌋ = B 2 + ⌊ x A 2 ⌋ 。
T ≤ 2 × 10 3 T\leq 2\times 10 ^ 3 T ≤ 2 × 1 0 3 ,其他所有数
∈ [ 1 , 10 8 ] \in [1, 10 ^ 8] ∈ [ 1 , 1 0 8 ] 。
直接二维数论分块即可。时间
O ( V ) \mathcal{O}(\sqrt V) O ( V ) 。
另解
考虑数论分块
[ l , r ] [l, r] [ l , r ] 固定整除值
A 1 x \frac{A_1} x x A 1 解出
d = A 2 x d = \frac{A_2}{x} d = x A 2 ,反推出
x x x 的范围
[ l , r ] ∩ [ A 2 d + 1 + 1 , A 2 d ] [l, r] \cap [\frac{A_2}{d + 1} + 1, \frac{A_2}{d}] [ l , r ] ∩ [ d + 1 A 2 + 1 , d A 2 ] 。
CPP #include <bits/stdc++.h>
using namespace std;
int T, a1, b1, a2, b2, n;
int main () {
cin >> T;
while (T--) {
int ans = 0 ;
cin >> a1 >> b1 >> a2 >> b2 >> n;
for (int l = 1 , r = 1 ; l <= n; l = r + 1 ) {
r = min (n, min (a1 / l ? a1 / (a1 / l) : n, a2 / l ? a2 / (a2 / l) : n));
if (b1 + a1 / l == b2 + a2 / l) ans += r - l + 1 ;
}
cout << ans << endl;
}
return 0 ;
}
求
∑ i = 1 n n m o d i \sum_{i = 1} ^ n n \bmod i ∑ i = 1 n n mod i 是经典问题:拆成
∑ i = 1 n ( n − ⌊ n i ⌋ i ) \sum_{i = 1} ^ n (n - \lfloor\frac n i\rfloor i) ∑ i = 1 n ( n − ⌊ i n ⌋ i ) 后数论分块,时间复杂度
O ( n ) \mathcal{O}(\sqrt n) O ( n ) 。
原式变形为
( ∑ i = 1 n n m o d i ) ( ∑ i = 1 m m m o d i ) − ∑ i = 1 min ( n , m ) ( n − ⌊ n i ⌋ i ) ( m − ⌊ m i ⌋ i ) . \left(\sum_{i = 1} ^ n n\bmod i\right) \left(\sum_{i = 1} ^ m m\bmod i\right) - \sum_{i = 1} ^ {\min(n, m)} \left(n - \left\lfloor\dfrac n i \right\rfloor i\right)\left(m - \left\lfloor\dfrac m i\right\rfloor i \right). ( i = 1 ∑ n n mod i ) ( i = 1 ∑ m m mod i ) − i = 1 ∑ m i n ( n , m ) ( n − ⌊ i n ⌋ i ) ( m − ⌊ i m ⌋ i ) .
使用数论分块解决。
你可能需要:
∑ i = 1 n i 2 = n ( n + 1 ) ( 2 n + 1 ) 6 . \sum_{i = 1} ^ n i ^ 2 = \frac {n(n + 1)(2n + 1)} 6. i = 1 ∑ n i 2 = 6 n ( n + 1 ) ( 2 n + 1 ) .
时间
O ( n ) \mathcal{O}(\sqrt n) O ( n ) 。
代码 。
不错的题目。
当
⌊ a − 1 k ⌋ < ⌊ b k ⌋ \lfloor\frac {a - 1} k\rfloor < \lfloor\frac b k\rfloor ⌊ k a − 1 ⌋ < ⌊ k b ⌋ 且
⌊ c − 1 k ⌋ < ⌊ d k ⌋ \lfloor\frac{c - 1} k\rfloor < \lfloor\frac d k\rfloor ⌊ k c − 1 ⌋ < ⌊ k d ⌋ 时,
[ a , b ] [a, b] [ a , b ] 和
[ c , d ] [c, d] [ c , d ] 均含有
k k k 的倍数。答案为所有这样的
k k k 的最大值。
我们当然可以四维数论分块,但注意到在使得
⌊ b k ⌋ \lfloor\frac b k \rfloor ⌊ k b ⌋ 相同且
⌊ d k ⌋ \lfloor \frac d k\rfloor ⌊ k d ⌋ 相同的
k k k 的区间
[ l , r ] [l, r] [ l , r ] 当中,选择
k = r k = r k = r 可以使
⌊ a − 1 k ⌋ \lfloor \frac{a - 1} k\rfloor ⌊ k a − 1 ⌋ 和
⌊ c − 1 k ⌋ \lfloor \frac {c - 1} k\rfloor ⌊ k c − 1 ⌋ 尽可能小,更有机会满足要求。若
k = r k = r k = r 都不满足条件,则
l ≤ k ≤ r l\leq k \leq r l ≤ k ≤ r 均不满足条件。因此二维数论分块即可。
时间
O ( T V ) \mathcal{O}(T\sqrt V) O ( T V ) 。
代码 。
数论分块优化 DP。
一个数如何分裂由后面分裂出来的数的最小值决定,所以贪心使分出来的数尽量均匀。例如,若
9 9 9 要分裂为若干个比
4 4 4 小的数,那么
3 , 3 , 3 3, 3, 3 3 , 3 , 3 比
2 , 3 , 4 2, 3, 4 2 , 3 , 4 更优。
从后往前考虑。对每个位置
i i i 和值
j ∈ [ 1 , a i ] j\in [1, a_i] j ∈ [ 1 , a i ] ,求出有多少以位置
i i i 开头的子段根据上述贪心策略分裂出的最小值为
j j j (
j j j 由
a i a_i a i 分裂零次或若干次得到),记为
f i , j f_{i, j} f i , j 。
考虑
f i + 1 , j f_{i + 1, j} f i + 1 , j 往前转移,需要将
a i a_i a i 分裂成若干不超过
j j j 的数,最少需要分裂成
⌈ a i j ⌉ \lceil \frac {a_i} j \rceil ⌈ j a i ⌉ 个数。新的最小值是多少?将
a i a_i a i 分裂成
c c c 个数,这些数最小值的最大值为
⌊ a i c ⌋ \lfloor \frac {a_i} c \rfloor ⌊ c a i ⌋ 。
注意到,对于固定的分裂次数,分裂出的值也是确定的。考虑枚举使得分裂次数相同的区间
[ l , r ] [l, r] [ l , r ] ,即
a i a_i a i 整除
[ l , r ] [l, r] [ l , r ] 内所有数向上取整的结果相同,可以通过向上取整的数论分块实现。
设
c = ⌈ a i l ⌉ c = \lceil \frac {a_i} l \rceil c = ⌈ l a i ⌉ 表示分裂出的数的个数,则分裂出的数的最小值为
v = ⌊ a i c ⌋ v = \lfloor \frac {a_i} c \rfloor v = ⌊ c a i ⌋ 。
∑ j = l r f i + 1 , j \sum_{j = l} ^ r f_{i + 1, j} ∑ j = l r f i + 1 , j 转移到
f i , v f_{i, v} f i , v 。
考虑在每个位置处统计该位置在所有子段中的总分裂次数之和,则贡献为
i × ( c − 1 ) × f i , v i\times (c - 1) \times f_{i , v} i × ( c − 1 ) × f i , v 。其含义为,共有
f i , v f_{i, v} f i , v 个以
i i i 开头的子段使得
a i a_i a i 要分裂出
c c c 个数,即分裂
c − 1 c - 1 c − 1 次。同时,若子段
[ i , k ] [i, k] [ i , k ] 在
i i i 处分裂
c − 1 c - 1 c − 1 次,则对于任意子段
[ x , k ] [x, k] [ x , k ] 满足
1 ≤ x ≤ i 1\leq x\leq i 1 ≤ x ≤ i ,
a i a_i a i 分裂的次数都是
c − 1 c - 1 c − 1 ,因为
a i a_i a i 的分裂不受前面的数的影响。
注意,当
c = 1 c = 1 c = 1 时,
f i , v f_{i, v} f i , v 即
f i , a i f_{i, a_i} f i , a i 需要加
1 1 1 ,表示新增以
a i a_i a i 结尾的子段。
用
vector 存储所有
f i f_i f i 并转移,时间
O ( n a i ) \mathcal{O}(n\sqrt {a_i}) O ( n a i ) 。滚动数组优化后空间
O ( n ) \mathcal{O}(n) O ( n ) 。
代码 。
4. 欧拉函数
欧拉函数是非常重要的数论函数。
4.1 定义与性质
n n n 的欧拉函数定义为在
[ 0 , n − 1 ] [0, n - 1] [ 0 , n − 1 ] 当中与
n n n 互质的整数个数,记为
φ ( n ) \varphi(n) φ ( n ) 。它也是
n n n 的简化剩余系的大小。
首先我们肯定希望
φ \varphi φ 是积性函数。
性质 1(积性函数)
证明
可以证明
( i , j ) (i, j) ( i , j ) 和
k k k 构成双射(证明如下),其中
i , j , k i, j, k i , j , k 分别和
n , m , n m n, m, nm n , m , nm 互质,则
φ ( n m ) = φ ( n ) φ ( m ) \varphi(nm) = \varphi(n)\varphi(m) φ ( nm ) = φ ( n ) φ ( m ) 。
因为
n ⊥ m n\perp m n ⊥ m ,由中国剩余定理(同余理论第三章),若
k ≠ k ′ k\neq k' k = k ′ ,则它们模
n n n 和模
m m m 的余数不完全相等。于是只需证明
k ⊥ n m k \perp nm k ⊥ nm 当且仅当
k k k 模
n n n 和模
m m m 分别和
n , m n, m n , m 互质,这是平凡的。
□ \square □
另一种证明
设与
n n n 互质的数为
a 1 ∼ φ ( n ) a_{1\sim \varphi(n)} a 1 ∼ φ ( n ) ,那么在
[ 0 , n m − 1 ] [0, nm - 1] [ 0 , nm − 1 ] 内与
n n n 互质的数为
j n + a i jn + a_i jn + a i ,其中
1 ≤ i ≤ φ ( n ) 1\leq i \leq \varphi(n) 1 ≤ i ≤ φ ( n ) ,
0 ≤ j < m 0\leq j < m 0 ≤ j < m 。
因为
n ⊥ m n\perp m n ⊥ m ,所以
j n jn jn 在模
m m m 下互不相同,否则
( j − j ′ ) n (j - j')n ( j − j ′ ) n 是
m m m 的倍数,可知
j ≡ j ′ ( m o d m ) j\equiv j'\pmod m j ≡ j ′ ( mod m ) ,矛盾。
因此,对每个
a i a_i a i ,
( j n + a i ) m o d m (jn + a_i)\bmod m ( jn + a i ) mod m 取遍
0 ∼ m − 1 0\sim m - 1 0 ∼ m − 1 ,其中有
φ ( m ) \varphi(m) φ ( m ) 个和
m m m 互质。
在
[ 0 , n m − 1 ] [0, nm - 1] [ 0 , nm − 1 ] 内共有
φ ( n ) φ ( m ) \varphi(n)\varphi(m) φ ( n ) φ ( m ) 个数同时和
n , m n, m n , m 互质(于是和
n m nm nm 互质)。
□ \square □
因为
φ \varphi φ 是积性函数,所以只需考虑其在质数幂处的取值。
性质 2
设
p p p 是质数,则
φ ( p k ) = ( p − 1 ) p k − 1 \varphi(p ^ k) = (p - 1)p ^ {k - 1} φ ( p k ) = ( p − 1 ) p k − 1 。
证明
因为
p p p 是质数,所以和
p p p 不互质当且仅当是
p p p 的倍数,共有
p k − 1 p ^ {k - 1} p k − 1 个。
□ \square □
根据性质 2 可线性筛欧拉函数。写成
φ ( p ) = p − 1 \varphi(p) = p - 1 φ ( p ) = p − 1 ,
φ ( p k ) = p φ ( p k − 1 ) ( k ≥ 2 ) \varphi(p ^ k) = p\varphi(p ^ {k - 1})\ (k\geq 2) φ ( p k ) = pφ ( p k − 1 ) ( k ≥ 2 ) ,方便线性筛。
CPP int cnt, pr[N], phi[N], vis[N];
void sieve () {
phi[1 ] = 1 ;
for (int i = 2 ; i < N; i++) {
if (!vis[i]) pr[++cnt] = i, phi[i] = i - 1 ;
for (int j = 1 ; j <= cnt && i * pr[j] < N; j++) {
vis[i * pr[j]] = 1 ;
phi[i * pr[j]] = (pr[j] - 1 ) * phi[i];
if (i % pr[j] == 0 ) {
phi[i * pr[j]] = pr[j] * phi[i];
break ;
}
}
}
}
性质 1 和性质 2 给出了直接计算欧拉函数的公式。
性质 3(计算欧拉函数)
设
n n n 的唯一分解为
∏ i = 1 m p i c i \prod_{i = 1} ^ m p_i ^ {c_i} ∏ i = 1 m p i c i ,则
φ ( n ) = n × ∏ i = 1 m p i − 1 p i . \varphi(n) = n\times \prod_{i = 1} ^ {m} \frac {p_i - 1} {p_i}. φ ( n ) = n × i = 1 ∏ m p i p i − 1 .
CPP int phi (int x) {
int ans = x;
for (int i = 2 ; i * i <= x; i++)
if (x % i == 0 ) {
while (x % i == 0 ) x /= i;
ans = ans / i * (i - 1 );
}
return ans / x * max (1 , x - 1 );
}
计算
φ ( n ) \varphi(n) φ ( n ) 的时间是分解质因数的
O ( n ) \mathcal{O}(\sqrt n) O ( n ) ,使用 Pollard-Rho 算法可以做到
O ( n 1 / 4 ) \mathcal{O}(n ^ {1 / 4}) O ( n 1/4 ) 。
欧拉函数的计算式也可以通过容斥原理证明。
证明
根据容斥原理,去掉所有被至少一个
n n n 的质因数整除的数,加上至少被两个
n n n 的质因数整除的数,以此类推,最终得到
φ ( n ) = n ∑ T ⊆ S ( − 1 ) ∣ T ∣ ∏ p ∈ S p \varphi(n) = n \sum_{T\subseteq S} \frac {(-1) ^ {|T|}}{\prod_{p\in S} p} φ ( n ) = n T ⊆ S ∑ ∏ p ∈ S p ( − 1 ) ∣ T ∣
其中
S S S 是
n n n 的质因数集合。上式是
n ∏ i = 1 m ( 1 − 1 p i ) n \prod_{i = 1} ^ m (1 - \frac 1 {p_i}) n ∏ i = 1 m ( 1 − p i 1 ) 的直接展开。
□ \square □
根据上式推出性质 1 和性质 2 是平凡的。
接下来给出一些常用的欧拉函数的性质。
性质 4
若
n ∣ m n\mid m n ∣ m ,则
φ ( n m ) = n φ ( m ) \varphi(nm) = n\varphi(m) φ ( nm ) = n φ ( m ) 。
证明
n m nm nm 的质因数集合和
m m m 的质因数集合相等,所以计算式右侧的乘积相等。唯一的差别在于系数分别是
n m nm nm 和
m m m 。
直观理解 :因为 n m nm nm 相较 m m m 没有增加质因数,所以原来与 m m m 互质的数仍与 n m nm nm 互质。[ 0 , n m − 1 ] [0, nm - 1] [ 0 , nm − 1 ] 当中与 m m m 互质的数的个数为 n φ ( m ) n\varphi(m) n φ ( m ) ,因为一个与 m m m 互质的数加上 m m m 的倍数后仍然与 m m m 互质。
容易发现
n ∣ m n\mid m n ∣ m 的条件可弱化为
m m m 含有
n n n 的所有质因数。在考虑互质的时候,质因数的幂次是不重要的,只有质因数集合是重要的。
性质 5
对
n ≥ 3 n \geq 3 n ≥ 3 ,
2 ∣ φ ( n ) 2\mid \varphi(n) 2 ∣ φ ( n ) 。
证明
若
x ⊥ n x \perp n x ⊥ n ,则
n − x ⊥ n n - x\perp n n − x ⊥ n 。所有小于
n n n 且与
n n n 互质的数能一一配对。
x = n − x x = n - x x = n − x 是特例,此时
x = n 2 x = \frac n 2 x = 2 n ,
gcd ( x , n ) = x ≠ 1 \gcd(x, n) = x \neq 1 g cd( x , n ) = x = 1 。
□ \square □
也可以考虑计算式。对于如果只含质因数
2 2 2 ,则
φ ( n ) = n 2 \varphi(n) = \frac n 2 φ ( n ) = 2 n 是偶数。否则奇质因数
p p p 的
p − 1 p \frac {p - 1} {p} p p − 1 将导致
φ ( n ) \varphi(n) φ ( n ) 是偶数。
性质 6
若
n ∣ m n \mid m n ∣ m ,则
φ ( n ) ∣ φ ( m ) \varphi(n) \mid \varphi(m) φ ( n ) ∣ φ ( m ) 。
回忆同余理论一开始的基本知识:
性质 7
对
d ∣ n d\mid n d ∣ n ,使得
gcd ( n , x ) = d \gcd(n, x) = d g cd( n , x ) = d 的
x ∈ [ 0 , n − 1 ] x\in [0, n - 1] x ∈ [ 0 , n − 1 ] 的数量为
φ ( n d ) \varphi(\frac n d) φ ( d n ) 。
证明
gcd ( n , x ) = d \gcd(n, x) = d g cd( n , x ) = d 要求
x x x 是
d d d 的倍数且
gcd ( n d , x d ) = 1 \gcd(\frac n d, \frac x d) = 1 g cd( d n , d x ) = 1 。因为
x d \frac x d d x 的范围是
[ 0 , n d − 1 ] [0, \frac n d - 1] [ 0 , d n − 1 ] ,所以
x x x 的数量为
φ ( n d ) \varphi(\frac n d) φ ( d n ) 。
□ \square □
考虑到
0 ∼ n − 1 0\sim n - 1 0 ∼ n − 1 的每个数和
n n n 的最大公约数都是
n n n 的因数,得到欧拉反演公式。
性质 8(Euler 反演)
∑ d ∣ n φ ( d ) = n . \sum_{d\mid n}\varphi(d) = n. d ∣ n ∑ φ ( d ) = n .
证明
枚举每个数和
n n n 的最大公约数
d d d ,由性质 7,
n = ∑ d ∣ n ∑ i = 0 n − 1 [ gcd ( n , i ) = d ] = ∑ d ∣ n φ ( n d ) = ∑ d ∣ n φ ( d ) . n = \sum_{d\mid n} \sum_{i = 0} ^ {n - 1} [\gcd(n, i) = d] = \sum_{d\mid n} \varphi\left(\frac n d\right) = \sum_{d\mid n} \varphi(d). n = d ∣ n ∑ i = 0 ∑ n − 1 [ g cd( n , i ) = d ] = d ∣ n ∑ φ ( d n ) = d ∣ n ∑ φ ( d ) .
1 ∗ φ = i d 1 * \varphi = \mathrm{id} 1 ∗ φ = id 。
φ ( d ) \varphi(d) φ ( d ) 对应和
n n n 的最大公约数是
n d \frac n d d n 的数。
定理 9.1(欧拉定理)
a φ ( n ) ≡ 1 ( m o d n ) . a ^ {\varphi(n)} \equiv 1\pmod n. a φ ( n ) ≡ 1 ( mod n ) .
定理 9.2(扩展欧拉定理)
a b ≡ { a b m o d φ ( n ) , a ⊥ n ; a b , a ⊥̸ n ∧ b < φ ( n ) ; a ( b m o d φ ( n ) ) + φ ( n ) , a ⊥̸ n ∧ b ≥ φ ( n ) ( m o d n ) . a ^ b \equiv \begin{cases}
a ^ {b\bmod \varphi(n)}, & a\perp n; \\
a ^ b, & a\not\perp n \land b < \varphi(n); \\
a ^ {(b\bmod \varphi(n)) + \varphi(n)}, & a\not\perp n \land b \geq \varphi(n)
\end{cases} \pmod n. a b ≡ ⎩ ⎨ ⎧ a b mod φ ( n ) , a b , a ( b mod φ ( n )) + φ ( n ) , a ⊥ n ; a ⊥ n ∧ b < φ ( n ) ; a ⊥ n ∧ b ≥ φ ( n ) ( mod n ) .
当
a ⊥ n a\perp n a ⊥ n 时,
a b m o d φ ( n ) ≡ a ( b m o d φ ( n ) ) + φ ( n ) a ^ {b\bmod \varphi(n)} \equiv a ^ {(b\bmod \varphi(n)) + \varphi(n)} a b mod φ ( n ) ≡ a ( b mod φ ( n )) + φ ( n ) ,于是在使用扩展欧拉定理时,先特判
b < φ ( n ) b < \varphi(n) b < φ ( n ) 的情况,然后用
a ( b m o d φ ( n ) ) + φ ( n ) a ^ {(b\bmod \varphi(n)) + \varphi(n)} a ( b mod φ ( n )) + φ ( n ) 作为结果,无需分讨
a ⊥ n a\perp n a ⊥ n 的情况。
4.2 例题
根据既约分数的定义
m ⊥ n m \perp n m ⊥ n 且
0 ≤ m < n 0 \leq m < n 0 ≤ m < n ,可知答案即
φ ( n ) \varphi(n) φ ( n ) 。
样例告诉我们分母不大于
2 × 10 5 2\times 10^5 2 × 1 0 5 ,因此预处理出
[ 1 , 2 × 10 5 ] [1,2\times 10^5] [ 1 , 2 × 1 0 5 ] 每个数的欧拉函数。从小到大枚举分母,求出分母后再根据剩余个数从小到大枚举分子。
b b b 是高精度,一个比较方便的处理方法是先用字符串存,如果长度不超过
9 9 9 则直接转成整型用快速幂算,否则直接算
a ( b m o d φ ( n ) ) + φ ( n ) a ^ {(b\bmod \varphi(n)) + \varphi(n)} a ( b mod φ ( n )) + φ ( n ) 。
CPP #include <bits/stdc++.h>
using namespace std;
int a, mod;
string st;
int ksm (int a, int b) {
int s = 1 ;
while (b) {
if (b & 1 ) s = 1ll * s * a % mod;
a = 1ll * a * a % mod, b >>= 1 ;
}
return s;
}
int Phi (int x) {
int res = x;
for (int i = 2 ; i * i <= x; i++) {
if (x % i == 0 ) {
res = res / i * (i - 1 );
while (x % i == 0 ) x /= i;
}
}
if (x > 1 ) res = res / x * (x - 1 );
return res;
}
int main () {
cin >> a >> mod >> st;
if (st.size () <= 9 ) {
int b = 0 ;
for (char it : st) b = b * 10 + it - '0' ;
cout << ksm (a, b) << endl;
return 0 ;
}
int phi = Phi (mod), b = 0 ;
for (char it : st) b = (b * 10 + it - '0' ) % phi;
cout << ksm (a, b + phi) << endl;
return 0 ;
}
题意简述:求
2 2 2 2 ⋯ m o d p 2 ^ {2 ^ {2 ^ {2 ^ {\cdots}}}} \bmod p 2 2 2 2 ⋯ mod p ,
1 ≤ p ≤ 10 7 1 \leq p \leq 10 ^ 7 1 ≤ p ≤ 1 0 7 。
初看这个无限幂塔,有点令人摸不着头脑,因为直觉告诉我们这个值不存在,就好像
∞ \infty ∞ 是一个不确定的数一样。但是,当
x x x 足够大时,
2 ↑ ↑ x 2\uparrow\uparrow x 2 ↑↑ x (
x x x 层幂塔)与
2 ↑ ↑ ( x + 1 ) 2\uparrow\uparrow (x + 1) 2 ↑↑ ( x + 1 ) 在模
p p p 下相同。
为什么呢?根据扩展欧拉定理,上面的幂塔等于
2 ( 2 2 2 ⋯ m o d φ ( p ) + φ ( p ) ) m o d p 2 ^ {(2 ^ {2 ^ {2 ^ {\cdots}}} \bmod \varphi(p) + \varphi(p))}\bmod p 2 ( 2 2 2 ⋯ mod φ ( p ) + φ ( p )) mod p ,不断使用扩展欧拉定理得到
2 ( 2 ( 2 ( 2 ⋯ m o d φ ( φ ( φ ( p ) ) ) + φ ( φ ( φ ( p ) ) ) ) m o d φ ( φ ( p ) ) + φ ( φ ( p ) ) ) m o d φ ( p ) + φ ( p ) ) m o d p \large
2 ^ {\left(2 ^ {\left(2 ^ {\left(2 ^ {\cdots}
\bmod \varphi(\varphi(\varphi(p))) +\varphi(\varphi(\varphi(p)))\right)}
\bmod \varphi(\varphi(p)) + \varphi(\varphi(p))\right)}
\bmod \varphi(p) + \varphi(p)\right)}
\bmod p 2 ( 2 ( 2 ( 2 ⋯ mod φ ( φ ( φ ( p ))) + φ ( φ ( φ ( p ))) ) mod φ ( φ ( p )) + φ ( φ ( p )) ) mod φ ( p ) + φ ( p ) ) mod p
因为幂塔会一直延伸下去,所以不需要担心出现
2 2 2 ⋯ < φ ( m o d ) 2 ^ {2 ^ {2 ^ {\cdots}}} < \varphi(mod) 2 2 2 ⋯ < φ ( m o d ) 的导致不能加
φ ( m o d ) \varphi(mod) φ ( m o d ) 的情况。
又因为
2 ∣ φ ( p ) , ∀ p ≥ 3 2\mid \varphi(p),\ \forall p \geq 3 2 ∣ φ ( p ) , ∀ p ≥ 3 (性质 5)且偶数的欧拉函数不超过其本身的一半,所以
φ ( p ) \varphi(p) φ ( p ) 的迭代值会指数衰减为
1 1 1 。此时,不用关心往上的幂次是多少了,因为任何数模
1 1 1 都得
0 0 0 ,这是终止条件。
综上,线性筛出
p p p 以内所有数的欧拉函数即可做到时间
O ( p + T log p ) \mathcal{O}(p+T\log p) O ( p + T log p ) 。
CPP int F (int x) {
if (x <= 2 ) return 0 ;
int v = phi (x);
return ksm (2 , F (v) + v, x);
}
根据上一题的结论,
c c c ⋯ a i m o d p c ^ {c ^ {c ^ {\cdots ^ {a_i}}}} \bmod p c c c ⋯ a i mod p 在迭代足够多次之后为定值。迭代次数
c n t cnt c n t 为使得
φ ( φ ( ⋯ φ ( φ ( p ) ) ⋯ ) ) = 1 \varphi(\varphi(\cdots\varphi(\varphi(p))\cdots)) = 1 φ ( φ ( ⋯ φ ( φ ( p )) ⋯ )) = 1 的迭代次数再加
1 1 1 ,是
O ( log p ) \mathcal O(\log p) O ( log p ) 数量级的。为什么要加
1 1 1 呢?如果不加
1 1 1 ,迭代
c n t cnt c n t 次之后顶上模
1 1 1 的数是
a i a_i a i 而不是
c c c ,当
a i = 0 a_i = 0 a i = 0 时会出问题,导致再迭代一次之后结果改变(例如
a = 0 a = 0 a = 0 ,
c = p = 2 c = p = 2 c = p = 2 )。
预处理每个位置上的幂塔迭代
0 ∼ c n t 0\sim cnt 0 ∼ c n t 次之后的结果。这样,如果一个位置迭代了
c n t cnt c n t 次,幂塔的值就不会改变了。可以用线段树维护区间内每个位置被迭代次数的最小值,如果该值已经等于
c n t cnt c n t ,则再迭代一轮也不会影响结果,直接返回。否则暴力递归下去修改。
一个细节是判断指数是否大于等于
φ ( p ) \varphi(p) φ ( p ) 。在计算幂塔的时候,除了
c = 1 c = 1 c = 1 以外,一旦当前结果大于等于模数,则之后的迭代也大于等于模数(还有
c = 2 c = 2 c = 2 ,
p = 6 p = 6 p = 6 的情况,
2 ≥ φ ( 6 ) 2\geq \varphi(6) 2 ≥ φ ( 6 ) 但
2 2 < 6 2 ^ 2 < 6 2 2 < 6 ,但是没法构造卡掉的数据)。因为底是固定的,所以采用光速幂,并记录
c l i m ≥ p c ^ {lim} \geq p c l im ≥ p 的阈值
l i m lim l im 方便比较结果和
p p p 的大小关系。
每个位置预处理
O ( log p ) \mathcal{O}(\log p) O ( log p ) 个值,每个值迭代
O ( log p ) \mathcal{O}(\log p) O ( log p ) 次,每次迭代用光速幂
O ( 1 ) \mathcal{O}(1) O ( 1 ) 计算。预处理的时间为
O ( n log 2 p ) \mathcal{O}(n\log ^ 2 p) O ( n log 2 p ) 。
查询时每个位置最多被操作
O ( log p ) \mathcal{O}(\log p) O ( log p ) 次,每次操作花费
O ( log n ) \mathcal{O}(\log n) O ( log n ) 的时间(因为在线段树上的)。因此,总时间复杂度为
O ( ( n log p + m log n ) log p ) \mathcal{O}((n\log p + m\log n)\log p) O (( n log p + m log n ) log p ) 。
5. 莫比乌斯函数
前置知识 :容斥原理。
对于数论函数,对因数下标求和是一步很常见的操作,形如
g ( n ) = ∑ d ∣ n f ( d ) g(n) = \sum_{d\mid n} f(d) g ( n ) = ∑ d ∣ n f ( d ) ,即狄利克雷前缀和。有时
g ( n ) g(n) g ( n ) 容易求出,我们需要根据
g = f ∗ 1 g = f * 1 g = f ∗ 1 反推出原函数
f = g ∗ 1 − 1 f = g * 1 ^ {-1} f = g ∗ 1 − 1 ,这说明
1 1 1 的狄利克雷卷积逆也很重要。
5.1 定义
5.1.1 引入
考虑这样一个问题:求
0 ∼ n − 1 0\sim n - 1 0 ∼ n − 1 有多少个数和
n n n 互质。读者知道答案是
φ ( n ) \varphi(n) φ ( n ) 。接下来我们将从另一个角度求解问题,并引出莫比乌斯函数的定义。
互质即最大公约数等于
1 1 1 。当 “恰好等于” 的限制令我们无从下手时,可以转变思路,使用容斥原理。
在这种因数相关的问题中,我们一般采用
倍数容斥 ,也就是把 “恰好等于
i i i ” 改成 “是
i i i 的倍数”(少量题目中是因数)。这样一来,
0 ∼ n − 1 0\sim n - 1 0 ∼ n − 1 当中和
n n n 的最大公约数是
i i i 的倍数的数的个数是容易计算的:若
i ∤ d i\nmid d i ∤ d 则为
0 0 0 ,否则为
n i \frac n i i n 。
用 gcd 是
1 1 1 的倍数的数的个数,减去 gcd 是
2 2 2 的倍数的数的个数,减去 gcd 是
3 3 3 的倍数的数的个数,以此类推。这样,gcd 是
6 6 6 的倍数的数被减去了两次,所以贡献还要加回来。问题转化为对每个 “gcd 是
i i i 的倍数的数的个数”
g ( i ) g(i) g ( i ) ,求出其对应的
容斥系数 μ ( i ) \mu(i) μ ( i ) 。
设 gcd 恰好等于
i i i 的数的个数为
f ( i ) f(i) f ( i ) ,则
g ( i ) = ∑ i ∣ d f ( d ) g(i) = \sum_{i\mid d} f(d) g ( i ) = ∑ i ∣ d f ( d ) 且答案为
f ( 1 ) = ∑ i = 1 n g ( i ) μ ( i ) f(1) = \sum_{i = 1} ^ n g(i)\mu(i) f ( 1 ) = ∑ i = 1 n g ( i ) μ ( i ) 。
5.1.2 推导
推法 1
考虑将
f f f 和
g g g 之间的关系写成狄利克雷卷积的形式,但目前的和式
g ( i ) = ∑ i ∣ d f ( d ) g(i) = \sum_{i\mid d} f(d) g ( i ) = ∑ i ∣ d f ( d ) 是对倍数下标而非因数下标求和。
本题中,只有
n n n 的因数的下标是重要的。因此,考虑将
f f f 和
g g g 的下标 “翻转”,即
i → n i i\to \frac n i i → i n 。这样,
f ( i ) f(i) f ( i ) 表示 gcd 是
n i \frac n i i n 的数的个数,
g ( i ) g(i) g ( i ) 表示 gcd 是
n i \frac n i i n 的倍数的数的个数,则
g ( i ) = ∑ d ∣ i f ( d ) g(i) = \sum_{d\mid i} f(d) g ( i ) = ∑ d ∣ i f ( d ) 且答案为
f ( n ) = ∑ i ∣ n g ( n i ) μ ( i ) f(n) = \sum_{i \mid n} g(\frac n i) \mu(i) f ( n ) = ∑ i ∣ n g ( i n ) μ ( i ) 。
于是
g = f ∗ 1 g = f * 1 g = f ∗ 1 ,可知
f = g ∗ 1 − 1 f = g * 1 ^ {-1} f = g ∗ 1 − 1 ,再结合答案式可知
μ = 1 − 1 \mu = 1 ^ {-1} μ = 1 − 1 。
推法 2
将容斥原理用到底。
f ( 1 ) f(1) f ( 1 ) 等于
f f f 在
1 1 1 的倍数处的取值和
g ( 1 ) g(1) g ( 1 ) ,减去在质数倍数处的取值和
∑ g ( p i ) \sum g(p_i) ∑ g ( p i ) 。但是这样多减去了两个不同质数乘积的倍数处的取值和
∑ g ( p i p j ) \sum g(p_ip_j) ∑ g ( p i p j ) ,所以要加上这些值。但是这样又多加上了在三个不同质数乘积的倍数处的取值和
∑ g ( p i p j p k ) \sum g(p_ip_jp_k) ∑ g ( p i p j p k ) ,所以要减去这些值,以此类推。如图(
图源 )。
若
n n n 为
k k k 个不同质数的乘积,则容斥系数为
μ ( n ) = ( − 1 ) k \mu(n) = (-1) ^ k μ ( n ) = ( − 1 ) k 。
在固定了所有无平方因数数的容斥系数的基础上,考虑
n n n 存在质因数幂次
c i > 1 c_i > 1 c i > 1 的情况。此时
f ( n ) f(n) f ( n ) 的贡献系数与将所有幂次
c i c_i c i 变成
1 1 1 之后的
n ′ n' n ′ 的
f ( n ′ ) f(n') f ( n ′ ) 的贡献系数相等,后者已知等于
0 0 0 (容斥原理),所以
f ( n ) f(n) f ( n ) 无贡献,自然不必加减
g ( n ) g(n) g ( n ) ,即
μ ( n ) = 0 \mu(n) = 0 μ ( n ) = 0 。
推法 3
更具体地推系数。
f ( 1 ) f(1) f ( 1 ) 对答案的贡献系数为 1 1 1 ,但现在贡献为 0 0 0 ,少加了一次,而 g ( 1 ) g(1) g ( 1 ) 是唯一含有 f ( 1 ) f(1) f ( 1 ) 的项,所以加上 g ( 1 ) g(1) g ( 1 ) ,且系数 μ ( 1 ) \mu(1) μ ( 1 ) 只能等于 1 1 1 。
f ( 2 ) f(2) f ( 2 ) 对答案的贡献系数为 0 0 0 ,但现在贡献为 ∑ i ∣ 2 ∧ i ≠ 2 μ ( i ) = μ ( 1 ) = 1 \sum_{i \mid 2\land i \neq 2} \mu(i) = \mu(1) = 1 ∑ i ∣ 2 ∧ i = 2 μ ( i ) = μ ( 1 ) = 1 ,多加了一次,而 g ( 2 ) g(2) g ( 2 ) 是除了系数已经不能动的 g ( 1 ) g(1) g ( 1 ) 以外唯一含有 f ( 2 ) f(2) f ( 2 ) 的项,所以减去 g ( 2 ) g(2) g ( 2 ) ,且系数 μ ( 2 ) \mu(2) μ ( 2 ) 只能等于 − 1 -1 − 1 。
f ( 3 ) f(3) f ( 3 ) 对答案的贡献系数为 0 0 0 ,但现在贡献为 ∑ i ∣ 3 ∧ i ≠ 3 μ ( i ) = μ ( 1 ) = 1 \sum_{i \mid 3\land i \neq 3} \mu(i) = \mu(1) = 1 ∑ i ∣ 3 ∧ i = 3 μ ( i ) = μ ( 1 ) = 1 ,多加了一次,而 g ( 3 ) g(3) g ( 3 ) 是除了系数已经不能动的 g ( 1 ) g(1) g ( 1 ) 以外唯一含有 f ( 3 ) f(3) f ( 3 ) 的项,所以减去 g ( 3 ) g(3) g ( 3 ) ,且系数 μ ( 3 ) \mu(3) μ ( 3 ) 只能等于 − 1 -1 − 1 。
f ( 4 ) f(4) f ( 4 ) 对答案的贡献系数为 0 0 0 ,但现在贡献为 ∑ i ∣ 4 ∧ i ≠ 4 μ ( i ) = μ ( 1 ) + μ ( 2 ) = 0 \sum_{i \mid 4\land i \neq 4} \mu(i) = \mu(1) + \mu(2) = 0 ∑ i ∣ 4 ∧ i = 4 μ ( i ) = μ ( 1 ) + μ ( 2 ) = 0 ,刚好。而 g ( 4 ) g(4) g ( 4 ) 是除了系数已经不能动的 g ( 1 ) g(1) g ( 1 ) 和 g ( 2 ) g(2) g ( 2 ) 以外唯一含有 f ( 4 ) f(4) f ( 4 ) 的项,所以 g ( 4 ) g(4) g ( 4 ) 的系数 μ ( 4 ) \mu(4) μ ( 4 ) 只能等于 0 0 0 。
以此类推,对
n > 1 n > 1 n > 1 有递推关系
μ ( n ) = − ∑ d ∣ n ∧ d ≠ n μ ( d ) \mu(n) = -\sum_{d\mid n \land d\neq n} \mu(d) μ ( n ) = − ∑ d ∣ n ∧ d = n μ ( d ) ,这正是
1 1 1 的狄利克雷卷积逆。
还需要计算
1 − 1 1 ^ {-1} 1 − 1 从而将推法 1、3 和推法 2 联系在一起。
设
μ = 1 − 1 \mu = 1 ^ {-1} μ = 1 − 1 ,则因为
1 1 1 是积性函数,所以
μ \mu μ 是积性函数,只需观察其在所有质数倍数处的取值。根据递推关系
μ ( n ) = − ∑ d ∣ n ∧ d ≠ n μ ( d ) , \mu(n) = -\sum_{d\mid n \land d\neq n} \mu(d), μ ( n ) = − d ∣ n ∧ d = n ∑ μ ( d ) ,
可得
μ ( p ) = − μ ( 1 ) = − 1 ; μ ( p 2 ) = − ( μ ( 1 ) + μ ( p ) ) = 0 ; μ ( p 3 ) = − ( μ ( 1 ) + μ ( p ) + μ ( p 2 ) ) = 0. \begin{aligned}
\mu(p) & = -\mu(1) = -1; \\
\mu(p ^ 2) & = -(\mu(1) + \mu(p)) = 0; \\
\mu(p ^ 3) & = -(\mu(1) + \mu(p) + \mu(p ^ 2)) = 0.
\end{aligned} μ ( p ) μ ( p 2 ) μ ( p 3 ) = − μ ( 1 ) = − 1 ; = − ( μ ( 1 ) + μ ( p )) = 0 ; = − ( μ ( 1 ) + μ ( p ) + μ ( p 2 )) = 0.
容易归纳证明当
k ≥ 2 k \geq 2 k ≥ 2 时,
μ ( p k ) = 0 \mu(p ^ k) = 0 μ ( p k ) = 0 。
设唯一分解
n = ∏ i = 1 m p i c i n = \prod_{i = 1} ^ m p_i ^ {c_i} n = ∏ i = 1 m p i c i 。根据
μ \mu μ 的积性,若存在
c i ≥ 2 c_i\geq 2 c i ≥ 2 则
μ ( n ) = 0 \mu(n) = 0 μ ( n ) = 0 ,否则
μ ( n ) = ( − 1 ) m \mu(n) = (-1) ^ m μ ( n ) = ( − 1 ) m 。
5.1.3 总结
为了从 “倍数下标的取值和”
g ( n ) g(n) g ( n ) 得到
f ( 1 ) = ∑ i = 1 n g ( i ) μ ( i ) f(1) = \sum_{i = 1} ^ n g(i)\mu(i) f ( 1 ) = ∑ i = 1 n g ( i ) μ ( i ) ,容斥系数(相当于对 “是质数
p i p_i p i 的倍数” 的关系做容斥)应等于
μ ( n ) = { 0 , ∃ d > 1 , d 2 ∣ n ; ( − 1 ) ω ( n ) , o t h e r w i s e . \mu(n) =
\begin{cases}
0, & \exists d > 1, d ^ 2\mid n; \\
(-1) ^ {\omega(n)}, & \mathrm{otherwise}.
\end{cases} μ ( n ) = { 0 , ( − 1 ) ω ( n ) , ∃ d > 1 , d 2 ∣ n ; otherwise .
这个函数是
1 1 1 的狄利克雷卷积逆,称为
莫比乌斯函数 。
我们可以直接验证
μ ∗ 1 = ϵ \mu * 1 = \epsilon μ ∗ 1 = ϵ :考虑
n n n 的所有质因数
p 1 ∼ m p_{1\sim m} p 1 ∼ m 。对于任意
k k k 个质因数的乘积
P P P ,它产生
μ ( P ) = ( − 1 ) k \mu(P) = (-1) ^ k μ ( P ) = ( − 1 ) k 的贡献。枚举
k k k ,则由二项式定理,
( μ ∗ 1 ) ( n ) = ∑ k = 0 m ( m k ) ( − 1 ) k = [ m = 0 ] = [ n = 1 ] . (\mu * 1)(n) = \sum_{k = 0} ^ m \binom m k (-1) ^ k = [m = 0] = [n = 1]. ( μ ∗ 1 ) ( n ) = k = 0 ∑ m ( k m ) ( − 1 ) k = [ m = 0 ] = [ n = 1 ] .
上述做法可以扩展到求
∑ i = 0 m − 1 [ i ⊥ n ] \sum_{i = 0} ^ {m - 1} [i\perp n] ∑ i = 0 m − 1 [ i ⊥ n ] 。它给出了一般化的结论:已知数论函数
f f f 的倍数下标的和,计算
f ( 1 ) f(1) f ( 1 ) 时,每个位置的贡献系数为莫比乌斯函数。
结论 1(φ = i d ∗ μ \varphi = id * \mu φ = i d ∗ μ )
回到原来的问题,求
0 ∼ n − 1 0\sim n - 1 0 ∼ n − 1 有多少个数和
n n n 互质。
采用推法 1 的翻转下标技巧:
f ( i ) f(i) f ( i ) 表示 gcd 是
n i \frac n i i n 的数的个数,
g ( i ) g(i) g ( i ) 表示 gcd 是
n i \frac n i i n 的倍数的数的个数,则
g ( i ) = ∑ d ∣ i f ( d ) g(i) = \sum_{d\mid i} f(d) g ( i ) = ∑ d ∣ i f ( d ) 且答案为
f ( n ) = ∑ i ∣ n g ( n i ) μ ( i ) f(n) = \sum_{i \mid n} g(\frac n i) \mu(i) f ( n ) = ∑ i ∣ n g ( i n ) μ ( i ) 。
我们知道
g ( i ) = i g(i) = i g ( i ) = i 且
f ( i ) = φ ( i ) f(i) = \varphi(i) f ( i ) = φ ( i ) ,所以
g ( i ) = ∑ d ∣ i f ( d ) g(i) = \sum_{d\mid i} f(d) g ( i ) = ∑ d ∣ i f ( d ) 说明
i d = 1 ∗ φ \mathrm{id} = 1 * \varphi id = 1 ∗ φ ,
f ( n ) = ∑ i ∣ n g ( n i ) μ ( i ) f(n) = \sum_{i \mid n} g(\frac n i) \mu(i) f ( n ) = ∑ i ∣ n g ( i n ) μ ( i ) 说明
φ = i d ∗ μ \varphi = \mathrm{id} * \mu φ = id ∗ μ ,即
φ ( n ) = ∑ d ∣ n n d μ ( d ) . \varphi(n) = \sum_{d\mid n} \frac n d \mu(d). φ ( n ) = d ∣ n ∑ d n μ ( d ) .
翻转下标之后可以写成狄利克雷卷积,
f → g f\to g f → g 是卷
1 1 1 ,所以
g → f g\to f g → f 是卷
μ \mu μ 。
5.2 狄利克雷差分
据定义,可线性筛出莫比乌斯函数。
CPP int vis[N], cnt, pr[N], mu[N];
void sieve () {
mu[1 ] = 1 ;
for (int i = 2 ; i < N; i++) {
if (!vis[i]) pr[++cnt] = i, mu[i] = -1 ;
for (int j = 1 ; j <= cnt && i * pr[j] < N; j++) {
vis[i * pr[j]] = 1 ;
if (i % pr[j] == 0 ) break ;
mu[i * pr[j]] = -mu[i];
}
}
}
当时间可以接受时,根据
μ \mu μ 的求逆递推式
O ( n log n ) \mathcal{O}(n\log n) O ( n log n ) 递推更方便。
CPP int mu[N];
void sieve () {
mu[1 ] = 1 ;
for (int i = 1 ; i < N; i++) {
for (int j = i + i; j < N; j += i) {
mu[j] -= mu[i];
}
}
}
我们知道数论函数卷
1 1 1 是狄利克雷前缀和,那么卷
μ \mu μ 就是前缀和的逆操作,即
狄利克雷差分 。将代码的
mu 替换为
f,相当于将
f f f 除以
1 1 1 ,即
f ← f ∗ μ f \gets f * \mu f ← f ∗ μ 。
CPP void PrefixSum (int *f) {
for (int i = N - 1 ; i; i--) {
for (int j = i + i; j < N; j += i) {
f[j] += f[i];
}
}
}
void Differential (int *f) {
for (int i = 1 ; i < N; i++) {
for (int j = i + i; j < N; j += i) {
f[j] -= f[i];
}
}
}
注意前缀和和差分的外层枚举顺序 ,需要从实际意义理解代码:已知
g n = ∑ d ∣ n f d g_n = \sum_{d\mid n} f_d g n = ∑ d ∣ n f d ,要求
f f f 。考虑递推,假设
f 1 ∼ n − 1 f_{1\sim n - 1} f 1 ∼ n − 1 已知(所以枚举最外层的
i i i 是从小到大),则
f n f_n f n 等于
g n g_n g n 减去
n n n 的所有不是它本身的因数的
f f f 值,即
f n = g n − ∑ d ∣ n ∧ d ≠ n f d f_n = g_n - \sum_{d\mid n\land d\neq n} f_d f n = g n − ∑ d ∣ n ∧ d = n f d 。枚举因数不方便,改为枚举倍数,提前减掉贡献(枚举
i i i 时已经算出
f i f_i f i )。
实际上
狄利克雷后缀和 更常见,也就是我们在引入中看到的例子。将
f f f 从狄利克雷后缀和当中还原出来也很简单,假设
f n + 1 ∼ N f_{n + 1\sim N} f n + 1 ∼ N 已知,从后往前递推
f n = g n − ∑ n ∣ d ∧ d ≠ n f d f_n = g_n - \sum_{n\mid d \land d\neq n} f_d f n = g n − ∑ n ∣ d ∧ d = n f d 即可。
CPP void Differential (int *f) {
for (int i = N - 1 ; i; i--) {
for (int j = i + i; j < N; j += i) {
f[i] -= f[j];
}
}
}
5.3 莫比乌斯反演
5.3.1 算法介绍
什么是
反演 ?给定
g i = ∑ j = 1 n a i , j f j g_i = \sum_{j = 1} ^ n a_{i, j} f_j g i = ∑ j = 1 n a i , j f j ,已知
g g g 求
f f f 的过程称为反演。
反演本质上是矩阵求逆,即若
g = A f g = Af g = A f 则
f = A − 1 g f = A ^ {-1}g f = A − 1 g ,其中
f , g f, g f , g 都是向量,
A A A 是系数矩阵。显然,最朴素的做法是直接算出
A − 1 A ^ {-1} A − 1 ,然后将矩阵和向量乘起来。当然,我们在 OI 中学习的各种反演会根据
A A A 的特殊性质,更高效地计算
A − 1 g A ^ {-1}g A − 1 g ,毕竟矩阵求逆本身需要
O ( n 3 ) \mathcal{O}(n ^ 3) O ( n 3 ) 。例如,二项式反演是直接给出
A − 1 A ^ {-1} A − 1 的代数表示。这样,如果只算
f f f 的一个位置,则只需要
O ( n ) \mathcal{O}(n) O ( n ) 的时间。
最基本的 莫比乌斯反演 是狄利克雷前缀和的形式,但后缀和形式有更多的实际应用。
前缀和 :若 g ( n ) = ∑ d ∣ n f ( d ) g(n) = \sum_{d\mid n} f(d) g ( n ) = ∑ d ∣ n f ( d ) ,则 f ( n ) = ∑ d ∣ n g ( d ) μ ( n d ) f(n) = \sum_{d\mid n} g(d)\mu(\frac n d) f ( n ) = ∑ d ∣ n g ( d ) μ ( d n ) 。可以理解为 g = f ∗ 1 g = f * 1 g = f ∗ 1 ,f = g ∗ μ f = g * \mu f = g ∗ μ 。
后缀和 :若 g ( n ) = ∑ n ∣ d f ( d ) g(n) = \sum_{n\mid d} f(d) g ( n ) = ∑ n ∣ d f ( d ) ,则 f ( n ) = ∑ n ∣ d g ( d ) μ ( d n ) f(n) = \sum_{n\mid d} g(d) \mu(\frac d n) f ( n ) = ∑ n ∣ d g ( d ) μ ( n d ) 。可以理解为 μ \mu μ 作为倍数容斥的系数。
当然,更常见的(也是广泛认为的)莫反是
μ \mu μ 作容斥系数在代数形式下的推导技巧,可以类比 “组合意义天地灭,代数推导保平安”。我们举一个最简单的例子:考虑狄利克雷后缀和。根据之前用各种方法推导出的结论,
f ( 1 ) = ∑ i = 1 n g ( i ) μ ( i ) . \begin{aligned}
f(1) = \sum_{i = 1} ^ n g(i)\mu(i).
\end{aligned} f ( 1 ) = i = 1 ∑ n g ( i ) μ ( i ) .
用代数形式的推导技巧,就是
f ( 1 ) = ∑ i = 1 n f ( i ) [ i = 1 ] = ∑ i = 1 n f ( i ) ϵ ( i ) = ∑ i = 1 n f ( i ) ⋅ ( 1 ∗ μ ) ( i ) = ∑ i = 1 n f ( i ) ∑ d ∣ i μ ( d ) = ∑ d = 1 n μ ( d ) ∑ d ∣ i f ( i ) = ∑ d = 1 n μ ( d ) g ( d ) . \begin{aligned}
f(1) & = \sum_{i = 1} ^ n f(i) [i = 1] \\
& = \sum_{i = 1} ^ n f(i) \epsilon(i) \\
& = \sum_{i = 1} ^ n f(i) \cdot (1 * \mu)(i) \\
& = \sum_{i = 1} ^ n f(i) \sum_{d\mid i} \mu(d) \\
& = \sum_{d = 1} ^ n \mu(d) \sum_{d\mid i} f(i) \\
& = \sum_{d = 1} ^ n \mu(d) g(d). \\
\end{aligned} f ( 1 ) = i = 1 ∑ n f ( i ) [ i = 1 ] = i = 1 ∑ n f ( i ) ϵ ( i ) = i = 1 ∑ n f ( i ) ⋅ ( 1 ∗ μ ) ( i ) = i = 1 ∑ n f ( i ) d ∣ i ∑ μ ( d ) = d = 1 ∑ n μ ( d ) d ∣ i ∑ f ( i ) = d = 1 ∑ n μ ( d ) g ( d ) .
简单来说就是把
[ n = 1 ] [n = 1] [ n = 1 ] 写成
∑ d ∣ n μ ( d ) \sum_{d\mid n} \mu(d) ∑ d ∣ n μ ( d ) ,用和式代替艾佛森括号。
用和式代替判断式是一个重要的解题技巧,但这个过程并不直观,导致初学者难以上手。例如对于奇质数
p p p 有
∑ x = 1 p − 1 [ x 2 = a ] = ( a p − 1 2 m o d p ) + 1 , \sum_{x = 1} ^ {p - 1} [x ^ 2 = a] = (a ^ {\frac{p - 1} 2} \bmod p) + 1, x = 1 ∑ p − 1 [ x 2 = a ] = ( a 2 p − 1 mod p ) + 1 ,
单位根反演
[ n ∣ a ] = 1 n ∑ i = 0 n − 1 ω n i a . [n\mid a] = \frac 1 n\sum_{i = 0} ^ {n - 1} \omega_n ^ {ia}. [ n ∣ a ] = n 1 i = 0 ∑ n − 1 ω n ia .
从判断式到和式的过程逐渐形成了套路,了解其背后的逻辑有助于读者掌握并运用这种套路。
以上其实就是莫反的全部内容了,它是一个比较吃熟练度的知识点,需要多做题。我们将从众多例题当中感受到莫反的广泛应用。
5.3.2 结论与技巧
本小节介绍几个莫反相关的系统性套路。
最常见的套路是
[ i ⊥ j ] [i\perp j] [ i ⊥ j ] 转化为枚举
d ∣ gcd ( i , j ) d\mid \gcd(i, j) d ∣ g cd( i , j ) 并对
μ ( d ) \mu(d) μ ( d ) 求和,这样可以先枚举
d d d ,此时
i , j i, j i , j 独立。
结论 1
∑ i = 1 n ∑ j = 1 m [ i ⊥ j ] = ∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) = 1 ] = ∑ i = 1 n ∑ j = 1 m ∑ d ∣ gcd ( i , j ) μ ( d ) = ∑ d = 1 min ( n , m ) μ ( d ) ∑ i = 1 n ∑ j = 1 m [ d ∣ i ] [ d ∣ j ] = ∑ d = 1 min ( n , m ) μ ( d ) ⌊ n d ⌋ ⌊ m d ⌋ . \begin{aligned}
& \sum_{i = 1} ^ n \sum_{j = 1} ^ m [i\perp j] \\
= \, & \sum_{i = 1} ^ n \sum_{j = 1} ^ m [\gcd(i, j) = 1] \\
= \, & \sum_{i = 1} ^ n \sum_{j = 1} ^ m \sum_{d\mid \gcd(i, j)} \mu(d) \\
= \, & \sum_{d = 1} ^ {\min(n, m)} \mu(d) \sum_{i = 1} ^ n \sum_{j = 1} ^ m [d\mid i][d\mid j] \\
= \; & \sum_{d = 1} ^ {\min(n, m)} \mu(d) \left\lfloor \dfrac n d \right\rfloor \left\lfloor \dfrac m d \right\rfloor.
\end{aligned} = = = = i = 1 ∑ n j = 1 ∑ m [ i ⊥ j ] i = 1 ∑ n j = 1 ∑ m [ g cd( i , j ) = 1 ] i = 1 ∑ n j = 1 ∑ m d ∣ g c d ( i , j ) ∑ μ ( d ) d = 1 ∑ m i n ( n , m ) μ ( d ) i = 1 ∑ n j = 1 ∑ m [ d ∣ i ] [ d ∣ j ] d = 1 ∑ m i n ( n , m ) μ ( d ) ⌊ d n ⌋ ⌊ d m ⌋ .
显然,实际含义是对 “最大公约数是
n n n 的倍数” 的
( i , j ) (i, j) ( i , j ) 对数量做倍数容斥。
结论 2
因为
φ ∗ 1 = i d \varphi * 1 = \mathrm{id} φ ∗ 1 = id ,所以
i d ∗ μ = φ \mathrm{id} * \mu = \varphi id ∗ μ = φ ,即
∑ d ∣ n n μ ( d ) d = φ ( n ) . \sum_{d \mid n} \frac {n\mu(d)} d = \varphi(n). d ∣ n ∑ d n μ ( d ) = φ ( n ) .
变式为
∑ d ∣ n μ ( d ) d = φ ( n ) n . \sum_{d\mid n} \frac{\mu(d)} d = \frac {\varphi(n)} n. d ∣ n ∑ d μ ( d ) = n φ ( n ) .
结论 3
d ( i j ) = ∑ x ∣ i ∑ y ∣ j [ x ⊥ y ] . d(ij) = \sum\limits_{x \mid i}\sum\limits_{y\mid j} [x\perp y]. d ( ij ) = x ∣ i ∑ y ∣ j ∑ [ x ⊥ y ] .
考虑单个质因数
p p p ,再用中国剩余定理合并,即不同质因数的贡献相乘。
设
a = v p ( i ) a = v_p(i) a = v p ( i ) 即
i i i 含质因数
p p p 的数量,
b = v p ( j ) b = v_p(j) b = v p ( j ) ,则
v p ( i j ) = a + b v_p(ij) = a + b v p ( ij ) = a + b 。对于
i j ij ij 的约数
d d d ,若
v p ( d ) ≤ a v_p(d) \leq a v p ( d ) ≤ a ,则令其对应
v p ( x ) = v p ( d ) v_p(x) = v_p(d) v p ( x ) = v p ( d ) ,
v p ( y ) = 0 v_p(y) = 0 v p ( y ) = 0 ;若
v p ( d ) > a v_p(d) > a v p ( d ) > a ,则令其对应
v p ( x ) = 0 v_p(x) = 0 v p ( x ) = 0 ,
v p ( y ) = v p ( d ) − a v_p(y) = v_p(d) - a v p ( y ) = v p ( d ) − a 。容易发现互质对
( x , y ) (x, y) ( x , y ) 和
d d d 之间形成双射,因此
d d d 就等于
[ x ⊥ y ] [x\perp y] [ x ⊥ y ] 的对数。
简单来说就是
( a , 0 ) , ( a − 1 , 0 ) , ⋯ , ( 1 , 0 ) , ( 0 , 0 ) , ( 0 , 1 ) , ⋯ , ( 0 , b − 1 ) , ( 0 , b ) (a, 0), (a - 1, 0), \cdots, (1, 0), (0, 0), (0, 1), \cdots, (0, b - 1), (0, b) ( a , 0 ) , ( a − 1 , 0 ) , ⋯ , ( 1 , 0 ) , ( 0 , 0 ) , ( 0 , 1 ) , ⋯ , ( 0 , b − 1 ) , ( 0 , b )
一共
a + b + 1 a + b + 1 a + b + 1 对,和
d ( i j ) d(ij) d ( ij ) 当中质因数
p p p 的贡献系数
( a + b + 1 ) (a + b + 1) ( a + b + 1 ) 一致。
例题:P3327。
结论 4
∑ i = 1 N gcd ( k , i ) = ∑ d ∣ k d ∑ i = 1 N d [ k d ⊥ i ] = ∑ d ∣ k d ∑ d ′ ∣ k d μ ( d ′ ) ∑ i = 1 N d [ d ′ ∣ i ] = ∑ d ∣ k d ∑ d ′ ∣ k d μ ( d ′ ) ⌊ N d d ′ ⌋ = ∑ T ∣ k ⌊ N T ⌋ ∑ d ∣ T d μ ( T d ) = ∑ T ∣ k ⌊ N T ⌋ φ ( T ) . \begin{aligned}
& \sum_{i = 1} ^ N \gcd(k, i) \\
= \; & \sum_{d \mid k} d \sum_{i = 1} ^ {\frac N d} \left[\frac k d\perp i\right] \\
= \; & \sum_{d \mid k} d \sum_{d'\mid \frac k d} \mu(d') \sum_{i = 1} ^ {\frac N d} [d'\mid i] \\
= \; & \sum_{d \mid k} d \sum_{d' \mid \frac k d} \mu(d') \left\lfloor \frac {N} {dd'} \right\rfloor \\
= \; & \sum_{T \mid k} \left\lfloor\frac {N} {T}\right\rfloor \sum_{d\mid T} d \mu\left(\frac T d\right) \\
= \; & \sum_{T \mid k} \left\lfloor\frac {N} {T}\right\rfloor \varphi(T).
\end{aligned} = = = = = i = 1 ∑ N g cd( k , i ) d ∣ k ∑ d i = 1 ∑ d N [ d k ⊥ i ] d ∣ k ∑ d d ′ ∣ d k ∑ μ ( d ′ ) i = 1 ∑ d N [ d ′ ∣ i ] d ∣ k ∑ d d ′ ∣ d k ∑ μ ( d ′ ) ⌊ d d ′ N ⌋ T ∣ k ∑ ⌊ T N ⌋ d ∣ T ∑ d μ ( d T ) T ∣ k ∑ ⌊ T N ⌋ φ ( T ) .
以上推导过程用到了莫反推式子时的常用技巧:将枚举的两个约数
d ∣ n d\mid n d ∣ n 和
d ′ ∣ n d d'\mid \frac n d d ′ ∣ d n 乘起来,枚举乘积
T = d d ′ T = dd' T = d d ′ ,通常会带来奇妙的化学反应。
另一种推法是用
i d = 1 ∗ φ \mathrm{id} = 1 * \varphi id = 1 ∗ φ 将
gcd ( i , k ) \gcd(i, k) g cd( i , k ) 写成
∑ d ∣ gcd ( i , k ) φ ( d ) \sum_{d \mid \gcd(i, k)} \varphi(d) ∑ d ∣ g c d ( i , k ) φ ( d ) ,枚举
d d d ,则
d d d 需要是
k k k 的因数,且
i i i 需要是
d d d 的倍数,这样的
i i i 共有
⌊ N d ⌋ \lfloor \frac N d\rfloor ⌊ d N ⌋ 个。
5.4 例题
除特殊说明外,所有分式默认向下取整。
∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) = k ] . \sum_{i = 1} ^ n \sum_{j = 1} ^ m [\gcd(i, j) = k]. i = 1 ∑ n j = 1 ∑ m [ g cd( i , j ) = k ] .
∑ i = 1 n k ∑ j = 1 m k [ gcd ( i , j ) = 1 ] . \sum_{i = 1} ^ {\frac n k} \sum_{j = 1} ^ {\frac m k} [\gcd(i, j) = 1]. i = 1 ∑ k n j = 1 ∑ k m [ g cd( i , j ) = 1 ] .
莫比乌斯反演,得
∑ i = 1 n k ∑ j = 1 m k ∑ d ∣ gcd ( i , j ) μ ( d ) . \sum_{i = 1} ^ {\frac n k} \sum_{j = 1} ^ {\frac m k} \sum_{d\mid \gcd(i, j)} \mu(d). i = 1 ∑ k n j = 1 ∑ k m d ∣ g c d ( i , j ) ∑ μ ( d ) .
枚举约数
d d d ,记
c = min ( n k , m k ) c = \min(\frac n k, \frac m k) c = min ( k n , k m ) ,则
∑ d = 1 c μ ( d ) ∑ i = 1 n k [ d ∣ i ] ∑ j = 1 m k [ d ∣ j ] . \sum_{d = 1} ^ c \mu(d) \sum_{i = 1} ^ {\frac n k} [d\mid i] \sum_{j = 1} ^ {\frac m k} [d\mid j]. d = 1 ∑ c μ ( d ) i = 1 ∑ k n [ d ∣ i ] j = 1 ∑ k m [ d ∣ j ] .
由于
1 ∼ x 1\sim x 1 ∼ x 当中
y y y 的倍数有
x y \frac x y y x 个,故原式化为
∑ d = 1 c μ ( d ) n k d m k d . \sum_{d = 1} ^ c \mu(d) \dfrac n {kd} \dfrac m {kd}. d = 1 ∑ c μ ( d ) k d n k d m .
二维数论分块即可,时间复杂度
O ( n + T n ) \mathcal{O}(n + T\sqrt n) O ( n + T n ) 。注意非必要不开
long long。
代码 。
也可以不做二维差分,用四维数论分块替换四个二维数论分块,减小常数。
代码 。
容易发现答案即
2 ∑ i = 1 n ∑ j = 1 m gcd ( i , j ) − n m 2\sum_{i = 1} ^ n \sum_{j = 1} ^ m \gcd(i, j) - nm 2 ∑ i = 1 n ∑ j = 1 m g cd( i , j ) − nm ,可以直接莫反硬推式子。
也可以对每个
d d d 求出
gcd ( i , j ) = d \gcd(i, j) = d g cd( i , j ) = d 的对数,这是最开始的引入当中提到的对
gcd ( i , j ) \gcd(i, j) g cd( i , j ) 是
d d d 的倍数的对数做倍数容斥,即做狄利克雷后缀和的差分
时间复杂度
O ( n log n ) \mathcal{O}(n\log n) O ( n log n ) 。
代码 。
如果用技巧 4:
∑ i = 1 n ∑ j = 1 m gcd ( i , j ) = ∑ i = 1 n ∑ j = 1 m ∑ d ∣ gcd ( i , j ) φ ( d ) = ∑ d = 1 n φ ( d ) n d m d . \sum_{i = 1} ^ n\sum_{j = 1} ^ m \gcd(i, j) = \sum_{i = 1} ^ n\sum_{j = 1} ^ m \sum_{d\mid \gcd(i, j)} \varphi(d) = \sum_{d = 1} ^ n \varphi(d) \frac n d \frac m d. i = 1 ∑ n j = 1 ∑ m g cd( i , j ) = i = 1 ∑ n j = 1 ∑ m d ∣ g c d ( i , j ) ∑ φ ( d ) = d = 1 ∑ n φ ( d ) d n d m .
这样就是线性了!
设
f ( n ) f(n) f ( n ) 表示
[ 1 , n ] [1, n] [ 1 , n ] 当中非完全平方数倍数的数的个数。二分答案,找到最小的
r r r 使得
f ( r ) ≥ K f(r) \geq K f ( r ) ≥ K ,则
r r r 即为所求。
首先去掉
2 2 , 3 2 , ⋯ , p 2 2 ^ 2, 3 ^ 2, \cdots, p ^ 2 2 2 , 3 2 , ⋯ , p 2 的倍数,但同时是其中两个数的倍数的数会被算两次,所以加上
( p 1 p 2 ) 2 (p_1p_2) ^ 2 ( p 1 p 2 ) 2 的倍数,依次类推。这是倍数容斥,系数为莫比乌斯函数。因此
f ( n ) = ∑ i μ ( i ) n i 2 . f(n) = \sum_{i} \mu(i) \frac n {i ^ 2}. f ( n ) = i ∑ μ ( i ) i 2 n .
i i i 的上界为
n \sqrt n n ,直接计算即可。
时间复杂度
O ( n log n ) \mathcal{O}(\sqrt n \log n) O ( n log n ) 。
代码 。
设
c i c_i c i 表示简单路径上所有点都是
i i i 的倍数的点对数量,设
s i s_i s i 表示答案,则
c i = ∑ i ∣ d s d c_i = \sum_{i\mid d} s_d c i = ∑ i ∣ d s d ,狄利克雷后缀和。于是
s i = ∑ i ∣ d c i μ ( d i ) s_i = \sum_{i\mid d} c_i \mu(\frac {d} i) s i = ∑ i ∣ d c i μ ( i d ) ,狄利克雷后缀差分即可。
c i c_i c i 容易直接算。为了避免每次建图,用并查集维护连通块。
时间复杂度
O ( V log V + n d ( V ) α ( n ) ) \mathcal{O}(V\log V + n d(V)\alpha(n)) O ( V log V + n d ( V ) α ( n )) 。
代码 。
∑ i = 1 n lcm ( i , n ) = n ∑ i = 1 n i gcd ( i , n ) = n ∑ d ∣ n ∑ i = 1 n i d [ gcd ( i , n ) = d ] = n ∑ d ∣ n ∑ i = 1 n d i [ i ⊥ n d ] . \begin{aligned}
& \sum_{i = 1} ^ n \operatorname{lcm}(i, n) \\
= \; & n \sum_{i = 1} ^ n \frac i {\gcd(i, n)} \\
= \; & n \sum_{d\mid n} \sum_{i = 1} ^ n \frac i d [\gcd(i, n) = d] \\
= \; & n \sum_{d\mid n} \sum_{i = 1} ^ {\frac n d} i \left[i\perp \frac n d\right].
\end{aligned} = = = i = 1 ∑ n lcm ( i , n ) n i = 1 ∑ n g cd( i , n ) i n d ∣ n ∑ i = 1 ∑ n d i [ g cd( i , n ) = d ] n d ∣ n ∑ i = 1 ∑ d n i [ i ⊥ d n ] .
设
F ( n ) F(n) F ( n ) 表示
n n n 以内所有与
n n n 互质的数的和。当
n ≥ 2 n \geq 2 n ≥ 2 时,因为若
x ⊥ n x\perp n x ⊥ n 则
n − x ⊥ n n - x\perp n n − x ⊥ n ,所以与
n n n 互质的数成对出现且和为
n n n 。也就是说,每个与
n n n 互质的数对
F ( n ) F(n) F ( n ) 的平均贡献是
n 2 \frac n 2 2 n 。因此
F ( n ) = n φ ( n ) 2 F(n) = \frac{n \varphi(n)} 2 F ( n ) = 2 n φ ( n ) 。
当
n = 1 n = 1 n = 1 时,
F ( 1 ) F(1) F ( 1 ) 显然为
1 1 1 。
F ( n ) = ∑ i = 1 n i [ i ⊥ n ] = ∑ i = 1 n i ∑ d ∣ gcd ( i , n ) μ ( d ) = ∑ d ∣ n μ ( d ) ∑ i = 1 n i [ d ∣ i ] = ∑ d ∣ n μ ( d ) d n d ( n d + 1 ) 2 = n 2 ∑ d ∣ n μ ( d ) ( n d + 1 ) = n ( φ ( n ) + ϵ ( n ) ) 2 . \begin{aligned}
F(n) & = \sum_{i = 1} ^ n i[i\perp n] \\
& = \sum_{i = 1} ^ n i \sum_{d \mid \gcd(i, n)} \mu(d) \\
& = \sum_{d\mid n} \mu(d) \sum_{i = 1} ^ n i[d\mid i] \\
& = \sum_{d\mid n} \mu(d) d \frac{\frac n d (\frac n d + 1)}{2} \\
& = \frac n 2 \sum_{d\mid n} \mu(d) \left(\frac n d + 1\right) \\
& = \frac {n(\varphi(n) + \epsilon(n))} 2.
\end{aligned} F ( n ) = i = 1 ∑ n i [ i ⊥ n ] = i = 1 ∑ n i d ∣ g c d ( i , n ) ∑ μ ( d ) = d ∣ n ∑ μ ( d ) i = 1 ∑ n i [ d ∣ i ] = d ∣ n ∑ μ ( d ) d 2 d n ( d n + 1 ) = 2 n d ∣ n ∑ μ ( d ) ( d n + 1 ) = 2 n ( φ ( n ) + ϵ ( n )) .
最后一步是因为
μ ∗ i d = φ \mu * \mathrm{id} = \varphi μ ∗ id = φ ,
μ ∗ 1 = ϵ \mu * 1 = \epsilon μ ∗ 1 = ϵ 。答案即
n ∑ d ∣ n F ( d ) n\sum_{d\mid n} F(d) n ∑ d ∣ n F ( d ) ,化简为
n 2 ( 1 + ∑ d ∣ n d φ ( d ) ) \frac n 2 (1 + \sum_{d\mid n} d \varphi(d)) 2 n ( 1 + ∑ d ∣ n d φ ( d )) 。
线性筛
1 ∗ ( i d × φ ) 1 * (\mathrm{id} \times \varphi) 1 ∗ ( id × φ ) 即可做到
O ( T + n ) \mathcal{O}(T + n) O ( T + n ) 。
代码 。
因为有多组询问,所以无法对每组
n , m n, m n , m 都求出
gcd ( i , j ) = d \gcd(i, j) = d g cd( i , j ) = d 的对数。
∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) ∈ P ] = ∑ p ∈ P ∑ i = 1 n p ∑ i = 1 m p [ gcd ( i , j ) = 1 ] = ∑ p ∈ P ∑ d = 1 min ( n p , m p ) μ ( d ) n p d m p d . \begin{aligned}
& \sum_{i = 1} ^ n \sum_{j = 1} ^ m [\gcd(i, j)\in \mathbb P] \\
= \; & \sum_{p\in \mathbb P} \sum_{i = 1} ^ {\frac n p} \sum_{i = 1} ^ {\frac m p}[\gcd(i, j) = 1] \\
= \; & \sum_{p\in \mathbb P} \sum_{d = 1} ^ {\min(\frac n p, \frac m p)} \mu(d) \frac n {pd} \frac m{pd}.
\end{aligned} = = i = 1 ∑ n j = 1 ∑ m [ g cd( i , j ) ∈ P ] p ∈ P ∑ i = 1 ∑ p n i = 1 ∑ p m [ g cd( i , j ) = 1 ] p ∈ P ∑ d = 1 ∑ m i n ( p n , p m ) μ ( d ) p d n p d m .
注意到分母上的
p d pd
p d 与两个变量相关,较麻烦,故考虑设
T = p d T = pd T = p d ,得
∑ T = 1 min ( n , m ) ∑ p ∣ T ∧ p ∈ P T n T m T μ ( T p ) . \sum_{T = 1} ^ {\min(n, m)} \sum_{p\mid T\land p\in\mathbb P} ^ T \frac n T \frac m T \mu \left(\frac T p\right). T = 1 ∑ m i n ( n , m ) p ∣ T ∧ p ∈ P ∑ T T n T m μ ( p T ) .
这一步调整了计算顺序,使得可通过乘法分配律提出向下取整的式子。
另一种推导方式:对
[ gcd ( i , j ) = p ] [\gcd(i, j) = p] [ g cd( i , j ) = p ] 做倍数容斥,再对所有质数
p p p 求和。贡献系数
f f f 为所有容斥系数之和,即
f ( n ) = ∑ p ∈ P ( μ ∗ ϵ p ) ( n ) f(n) = \sum_{p\in \mathbb P} (\mu * \epsilon_p)(n) f ( n ) = ∑ p ∈ P ( μ ∗ ϵ p ) ( n ) ,也就是
f f f 等于将
μ \mu μ 的下标扩大质数倍后求和。于是
f ( T ) = ∑ p ∣ T ∧ p ∈ P μ ( T p ) f(T) = \sum_{p \mid T\land p\in \mathbb P} \mu(\frac T p) f ( T ) = ∑ p ∣ T ∧ p ∈ P μ ( p T ) ,与上式等价。
f f f 可以类埃氏筛
n log log n n\log\log n n log log n 求出,因为每个位置仅与其所有质因数有关。求出
f f f 的前缀和,数论分块即可。时间复杂度
O ( T n + n log log n ) \mathcal{O}(T\sqrt n + n \log\log n) O ( T n + n log log n ) 。
尽管
f f f 不是积性函数,但
f ( T ) f(T) f ( T ) 可以类似线性筛积性函数求出。
时间复杂度
O ( T n + n ) \mathcal{O}(T\sqrt n+n) O ( T n + n ) 。
代码 。
记
c = min ( n , m ) c = \min(n, m) c = min ( n , m ) 。
根据
lcm = i j gcd \operatorname{lcm} = \frac {ij} {\gcd} lcm = g c d ij ,枚举
d = gcd ( i , j ) d = \gcd(i, j) d = g cd( i , j ) ,得
∑ d = 1 c ∑ i = 1 n ∑ j = 1 m i j d [ gcd ( i , j ) = d ] = ∑ d = 1 c d ∑ i = 1 n d ∑ j = 1 m d i j [ i ⊥ j ] . \begin{aligned}
& \sum_{d = 1} ^ c \sum_{i = 1} ^ n \sum_{j = 1} ^ m \frac {ij} d [\gcd(i, j) = d] \\
= \, & \sum\limits_{d = 1} ^ c d \sum\limits_{i = 1} ^ {\frac n d} \sum\limits_{j = 1} ^ {\frac m d} ij [i\perp j].
\end{aligned} = d = 1 ∑ c i = 1 ∑ n j = 1 ∑ m d ij [ g cd( i , j ) = d ] d = 1 ∑ c d i = 1 ∑ d n j = 1 ∑ d m ij [ i ⊥ j ] .
莫比乌斯反演,得
∑ d = 1 c d ∑ e = 1 c d μ ( e ) ∑ i = 1 n d ∑ j = 1 m d i j [ e ∣ i ∧ e ∣ j ] = ∑ d = 1 c d ∑ e = 1 c d μ ( e ) e 2 ∑ i = 1 n d e ∑ j = 1 m d e i j . \begin{aligned}
& \sum_{d = 1} ^ c d \sum_{e = 1} ^ {\frac c d} \mu(e) \sum_{i = 1} ^ {\frac n d} \sum_{j = 1} ^ {\frac m d} ij [e\mid i \land e\mid j] \\
= \, & \sum_{d = 1} ^ c d \sum_{e = 1} ^ {\frac c d} \mu(e) e ^ 2 \sum_{i = 1} ^ {\frac n {de}} \sum_{j = 1} ^ {\frac m {de}} ij.
\end{aligned} = d = 1 ∑ c d e = 1 ∑ d c μ ( e ) i = 1 ∑ d n j = 1 ∑ d m ij [ e ∣ i ∧ e ∣ j ] d = 1 ∑ c d e = 1 ∑ d c μ ( e ) e 2 i = 1 ∑ d e n j = 1 ∑ d e m ij .
后面两个
Σ \Sigma Σ 容易计算,但难以融入化简。考虑设
T = d e T = de T = d e ,
S ( T ) = ∑ i = 1 n T ∑ j = 1 m T i j S(T) = \sum_{i = 1} ^ {\frac n T}\sum_{j = 1} ^ \frac m T ij S ( T ) = ∑ i = 1 T n ∑ j = 1 T m ij ,交换枚举顺序,得
∑ T = 1 c S ( T ) ∑ e ∣ T μ ( e ) e 2 T e = ∑ T = 1 c S ( T ) T ∑ e ∣ T μ ( e ) e . \begin{aligned}
& \sum\limits_{T = 1} ^ c S(T) \sum\limits_{e \mid T} \mu(e) e ^ 2 \frac T e \\
= \, & \sum\limits_{T = 1} ^ c S(T) T \sum\limits_{e \mid T} \mu(e) e.
\end{aligned} = T = 1 ∑ c S ( T ) e ∣ T ∑ μ ( e ) e 2 e T T = 1 ∑ c S ( T ) T e ∣ T ∑ μ ( e ) e .
至此已经可以狄利克雷前缀和。不过我们可以做得更好。
注意到
μ ⋅ i d \mu \cdot \mathrm{id} μ ⋅ id 是积性函数,所以
f = 1 ∗ ( μ ⋅ i d ) f = 1 * (\mu \cdot \mathrm{id}) f = 1 ∗ ( μ ⋅ id ) 也是积性函数,可线性筛。则答案化简为
∑ i = 1 c S ( i ) f ( i ) i \sum_{i = 1} ^ c S(i)f(i)i ∑ i = 1 c S ( i ) f ( i ) i ,其中仅
S S S 与
n , m n, m n , m 有关。同时,注意到
S S S 仅涉及
n , m n, m n , m 整除值处的等差数列求和,因此求出
f ( i ) i f(i) i f ( i ) i 的前缀和后,可数论分块
O ( c ) \mathcal{O} (\sqrt c) O ( c ) 计算答案。
时间复杂度
O ( c + T c ) \mathcal{O}(c + T\sqrt c) O ( c + T c ) 。
代码 。
记
S = ∑ i = 1 N ∑ j = 1 N l c m ( A i , A j ) S = \sum_{i = 1} ^ N \sum_{j = 1} ^ N \mathrm{lcm}(A_i, A_j) S = ∑ i = 1 N ∑ j = 1 N lcm ( A i , A j ) ,则答案为
S S S 减去
∑ i = 1 N A i \sum_{i = 1} ^ N A_i ∑ i = 1 N A i 再除以
2 2 2 。问题转化为求
S S S 。
从枚举下标变成枚举值,设
c i c_i c i 表示
i i i 在
{ A } \{A\} { A } 当中的出现次数,即
c i = ∑ j = 1 N [ A j = i ] c_i = \sum_{j = 1} ^ N [A_j = i] c i = ∑ j = 1 N [ A j = i ] ,则
S = ∑ i = 1 N ∑ j = 1 N lcm ( A i , A j ) = ∑ d = 1 V ∑ i = 1 N ∑ j = 1 N A i A j d [ gcd ( A i , A j ) = d ] = ∑ d = 1 V ∑ i = 1 V ∑ j = 1 V i j c i c j d [ gcd ( i , j ) = d ] = ∑ d = 1 V d ∑ i = 1 V d ∑ j = 1 V d i j c i d c j d [ gcd ( i , j ) = 1 ] = ∑ d = 1 V d ∑ d ′ = 1 V d μ ( d ′ ) d ′ 2 ∑ i = 1 V d d ′ ∑ j = 1 V d d ′ i j c i d d ′ c j d d ′ = ∑ T = 1 V ∑ d ∣ T μ ( d ) d 2 T d ∑ i = 1 V T ∑ j = 1 V T i j c i T c j T = ∑ T = 1 V T f ( T ) g 2 ( T ) . \begin{aligned}
S
& = \sum_{i = 1} ^ N \sum_{j = 1} ^ N \operatorname{lcm}(A_i, A_j) \\
& = \sum_{d = 1} ^ V \sum_{i = 1} ^ N \sum_{j = 1} ^ N \frac {A_iA_j} d [\gcd(A_i, A_j) = d] \\
& = \sum_{d = 1} ^ V \sum_{i = 1} ^ V \sum_{j = 1} ^ V \frac {ij c_i c_j} d [\gcd(i, j) = d] \\
& = \sum_{d = 1} ^ V d \sum_{i = 1} ^ {\frac V d} \sum_{j = 1} ^ {\frac V d} ij c_{id} c_{jd} [\gcd(i, j) = 1] \\
& = \sum_{d = 1} ^ V d \sum_{d' = 1} ^ {\frac V d} \mu(d') {d'} ^ 2 \sum_{i = 1} ^ {\frac V {dd'}} \sum_{j = 1} ^ {\frac V {dd'}} ij c_{idd'} c_{jdd'} \\
& = \sum_{T = 1} ^ V \sum_{d \mid T} \mu(d) d ^ 2 \frac T d \sum_{i = 1} ^ {\frac V T} \sum_{j = 1} ^ {\frac V T} ijc_{iT}c_{jT} \\
& = \sum_{T = 1} ^ V T f(T) g ^ 2(T).
\end{aligned} S = i = 1 ∑ N j = 1 ∑ N lcm ( A i , A j ) = d = 1 ∑ V i = 1 ∑ N j = 1 ∑ N d A i A j [ g cd( A i , A j ) = d ] = d = 1 ∑ V i = 1 ∑ V j = 1 ∑ V d ij c i c j [ g cd( i , j ) = d ] = d = 1 ∑ V d i = 1 ∑ d V j = 1 ∑ d V ij c i d c j d [ g cd( i , j ) = 1 ] = d = 1 ∑ V d d ′ = 1 ∑ d V μ ( d ′ ) d ′ 2 i = 1 ∑ d d ′ V j = 1 ∑ d d ′ V ij c i d d ′ c j d d ′ = T = 1 ∑ V d ∣ T ∑ μ ( d ) d 2 d T i = 1 ∑ T V j = 1 ∑ T V ij c i T c j T = T = 1 ∑ V T f ( T ) g 2 ( T ) .
其中
T = d d ′ T = dd' T = d d ′ ,
f ( T ) = ∑ d ∣ T μ ( d ) d f(T) = \sum_{d\mid T} \mu(d) d f ( T ) = ∑ d ∣ T μ ( d ) d ,
g ( T ) = ∑ i = 1 V T i c i T g(T) = \sum_{i = 1} ^ {\frac V T} ic_{iT} g ( T ) = ∑ i = 1 T V i c i T 。
f f f 容易线性筛预处理,
g g g 可以枚举因数或狄利克雷后缀和。
时间复杂度
O ( V log V ) \mathcal{O}(V\log V) O ( V log V ) 或
O ( V log log V ) \mathcal{O}(V\log\log V) O ( V log log V ) 。
代码 。
记
c = min ( n , m ) c = \min(n, m) c = min ( n , m ) 。
a n s w e r = ∑ d = 1 c τ ( d ) ∑ i = 1 n d ∑ j = 1 m d τ ( i d ) τ ( j d ) [ gcd ( i , j ) = 1 ] = ∑ d = 1 c τ ( d ) ∑ d ′ = 1 c d μ ( d ′ ) ∑ i = 1 n d d ′ ∑ j = 1 m d d ′ τ ( i d d ′ ) τ ( j d d ′ ) . \begin{aligned}
\mathrm{answer} & = \sum_{d = 1} ^ c \tau(d) \sum_{i = 1} ^ {\frac n d} \sum_{j = 1} ^ {\frac m d} \tau(id)\tau(jd)[\gcd(i, j) = 1] \\
& = \sum_{d = 1} ^ c \tau(d) \sum_{d' = 1} ^ {\frac c d} \mu(d') \sum_{i = 1} ^ {\frac n {dd'}} \sum_{j = 1} ^ {\frac m {dd'}} \tau(idd')\tau(jdd').
\end{aligned} answer = d = 1 ∑ c τ ( d ) i = 1 ∑ d n j = 1 ∑ d m τ ( i d ) τ ( j d ) [ g cd( i , j ) = 1 ] = d = 1 ∑ c τ ( d ) d ′ = 1 ∑ d c μ ( d ′ ) i = 1 ∑ d d ′ n j = 1 ∑ d d ′ m τ ( i d d ′ ) τ ( j d d ′ ) .
类似 AT5200 的套路,枚举
T = d d ′ T = dd' T = d d ′ ,
O ( n ln n ) \mathcal{O}(n\ln n) O ( n ln n ) 分别预处理前面和后面,时间复杂度
O ( n ln n ) \mathcal{O}(n\ln n) O ( n ln n ) 。
实际上有更简单的推法:系数
τ ( gcd ( i , j ) ) \tau(\gcd(i, j)) τ ( g cd( i , j )) 启发我们将
τ ( i ) τ ( j ) \tau(i)\tau(j) τ ( i ) τ ( j ) 摊在所有
i , j i, j i , j 的公约数上,所以枚举公约数可得
a n s w e r = ∑ i = 1 n ∑ j = 1 m τ ( i ) τ ( j ) ∑ d ∣ i ∧ d ∣ j 1 = ∑ d = 1 c ∑ i = 1 n d ∑ j = 1 m d τ ( i d ) τ ( j d ) . \begin{aligned}
\mathrm{answer} & = \sum_{i = 1} ^ n \sum_{j = 1} ^ m \tau(i)\tau(j) \sum_{d\mid i\land d\mid j} 1 \\
& = \sum_{d = 1} ^ c \sum_{i = 1} ^ {\frac n d} \sum_{j = 1} ^ {\frac m d} \tau(id)\tau(jd).
\end{aligned} answer = i = 1 ∑ n j = 1 ∑ m τ ( i ) τ ( j ) d ∣ i ∧ d ∣ j ∑ 1 = d = 1 ∑ c i = 1 ∑ d n j = 1 ∑ d m τ ( i d ) τ ( j d ) .
直接预处理即可,时间复杂度
O ( n ln n ) \mathcal{O}(n\ln n) O ( n ln n ) 。
代码 。
两种做法均可使用狄利克雷后缀和做到
O ( n log log n ) \mathcal{O}(n\log\log n) O ( n log log n ) 。
和前几题一样的套路。枚举
gcd \gcd g cd,再莫比乌斯反演,根据
f ( n ) = μ 2 ( n ) f(n) = \mu ^ 2(n) f ( n ) = μ 2 ( n ) 得
∑ d = 1 n d k + 1 μ 2 ( d ) ∑ d ′ = 1 n d d ′ k μ ( d ′ ) ∑ i = 1 n d d ′ ∑ j = 1 n d d ′ ( i + j ) k . \sum_{d = 1} ^ n d ^ {k + 1} \mu ^ 2(d) \sum_{d' = 1} ^ {\frac n d} {d'} ^ k \mu(d') \sum_{i = 1} ^ {\frac n {dd'}}\sum_{j = 1} ^ {\frac n {dd'}} (i + j) ^ k. d = 1 ∑ n d k + 1 μ 2 ( d ) d ′ = 1 ∑ d n d ′ k μ ( d ′ ) i = 1 ∑ d d ′ n j = 1 ∑ d d ′ n ( i + j ) k .
∑ T = 1 n T k ∑ d ∣ T d μ 2 ( d ) μ ( n d ) ∑ i = 1 n T ∑ j = 1 n T ( i + j ) k . \sum_{T = 1} ^ n T ^ k \sum_{d \mid T} d \mu ^ 2(d) \mu\left(\frac n d\right) \sum_{i = 1} ^ {\frac n T}\sum_{j = 1} ^ {\frac n T} (i + j) ^ k. T = 1 ∑ n T k d ∣ T ∑ d μ 2 ( d ) μ ( d n ) i = 1 ∑ T n j = 1 ∑ T n ( i + j ) k .
线性筛预处理
f = ( d × μ 2 ) ∗ μ f = (d\times \mu ^ 2) * \mu f = ( d × μ 2 ) ∗ μ 的前缀和,并预处理自然数幂和(这部分要
O ( π ( n ) log k ) \mathcal{O}(\pi(n)\log k) O ( π ( n ) log k ) ,即
O ( n log k log n ) \mathcal{O}(n \frac {\log k} {\log n}) O ( n l o g n l o g k ) ,因为至少得对所有质数求
k k k 次幂)求后面的
∑ ( i + j ) k \sum (i + j) ^ k ∑ ( i + j ) k 。数论分块求答案。
时间复杂度
O ( n log k log n ) \mathcal{O}(n\frac {\log k}{\log n}) O ( n l o g n l o g k ) ,代码见下一题。
时间复杂度
O ( n log k log n + T n ) \mathcal{O}(n\frac {\log k}{\log n} + T\sqrt n) O ( n l o g n l o g k + T n ) 。注意卡空间。
代码 。
直接莫反
∑ d = 1 n ∑ i = 1 n d ∑ j = 1 n d [ i ⊥ j ] d d ( i + j ) = ∑ d = 1 n ∑ k = 1 n d μ ( k ) ∑ i = 1 n d k ∑ j = 1 n d k d k d ( i + j ) = ∑ d = 1 n ∑ k = 1 n d μ ( k ) ( ∑ i = 1 n d k d k d i ) 2 . \begin{aligned}
& \sum_{d = 1} ^ n \sum_{i = 1} ^ {\frac n d} \sum_{j = 1} ^ {\frac n d}[i\perp j] d ^ {d(i + j)} \\
= \, & \sum_{d = 1} ^ n \sum_{k = 1} ^ {\frac n d} \mu(k) \sum_{i = 1} ^ {\frac n {dk}} \sum_{j = 1} ^ {\frac n {dk}} d ^ {kd(i + j)} \\
= \, & \sum_{d = 1} ^ n \sum_{k = 1} ^ {\frac n d} \mu(k) \left(\sum_{i = 1} ^ {\frac n {dk}} d ^ {kdi}\right) ^ 2.
\end{aligned} = = d = 1 ∑ n i = 1 ∑ d n j = 1 ∑ d n [ i ⊥ j ] d d ( i + j ) d = 1 ∑ n k = 1 ∑ d n μ ( k ) i = 1 ∑ d k n j = 1 ∑ d k n d k d ( i + j ) d = 1 ∑ n k = 1 ∑ d n μ ( k ) i = 1 ∑ d k n d k d i 2 .
等比数列求和 & 快速幂,时间
O ( n log n log p ) \mathcal{O}(n\log n\log p) O ( n log n log p ) ,常数较大。可以进一步优化,但比较平凡。
提供一个简单的小常数 2log 做法。
因为幂次很大,不同底数很难合并,所以考虑枚举底数即最大公约数
d d d 。注意到指数是
d d d 的倍数,所以底数-指数对只有
O ( n log n ) \mathcal{O}(n\log n) O ( n log n ) 个。
这启发我们对于
d d d ,枚举所有可能的倍数
k d kd k d ,并求出有多少组对应的
( i d , j d ) (id, jd) ( i d , j d ) 满足
1 ≤ i d , j d ≤ n 1\leq id, jd\leq n 1 ≤ i d , j d ≤ n ,
i d + j d = k d id + jd = kd i d + j d = k d 且
i ⊥ j i\perp j i ⊥ j 。根据辗转相除法,
i ⊥ j i\perp j i ⊥ j 当且仅当
i ⊥ ( i + j ) i\perp (i + j) i ⊥ ( i + j ) ,即
i ⊥ k i\perp k i ⊥ k 。因此
d k d d ^ {kd} d k d 的数量等于
∑ i = l r [ i ⊥ k ] = ∑ i = l r ∑ d ∣ i , k μ ( d ) = ∑ d ∣ k μ ( d ) ∑ i = l r [ d ∣ i ] , \sum_{i = l} ^ r [i\perp k] = \sum_{i = l} ^ r \sum_{d\mid i, k} \mu(d) = \sum_{d\mid k} \mu(d) \sum_{i = l} ^ r [d\mid i], i = l ∑ r [ i ⊥ k ] = i = l ∑ r d ∣ i , k ∑ μ ( d ) = d ∣ k ∑ μ ( d ) i = l ∑ r [ d ∣ i ] ,
其中
l , r l, r l , r 是
i i i 的上下界。枚举约数计算,则单个
d d d 的时间复杂度为
1 ∼ n d 1\sim \frac n d 1 ∼ d n 的约数个数和,即
O ( n d log n d ) \mathcal{O}(\frac n d\log \frac n d) O ( d n log d n ) 。
总时间
∑ d = 1 n n d log n d \sum_{d = 1} ^ n \frac {n} d\log \frac n d ∑ d = 1 n d n log d n ,即
O ( n log 2 n ) \mathcal{O}(n\log ^ 2 n) O ( n log 2 n ) ,但常数很小,而且很好写。
代码 。
使用结论 3,套入莫反,得
∑ d = 1 min ( n , m ) μ ( d ) ∑ x = 1 n d ∑ y = 1 m d n x d m y d . \sum_{d = 1} ^ {\min(n, m)} \mu(d) \sum\limits_{x = 1} ^ {\frac n d} \sum_{y = 1} ^ {\frac m d} \frac n {xd} \frac m {yd}. d = 1 ∑ m i n ( n , m ) μ ( d ) x = 1 ∑ d n y = 1 ∑ d m x d n y d m .
数论分块预处理
g ( n ) = ∑ i = 1 n n i g(n) = \sum_{i = 1} ^ n \frac n i g ( n ) = ∑ i = 1 n i n ,则答案为
∑ d = 1 min ( n , m ) μ ( d ) g ( n d ) g ( m d ) \sum_{d = 1} ^ {\min(n, m)} \mu(d) g(\frac n d) g(\frac m d) ∑ d = 1 m i n ( n , m ) μ ( d ) g ( d n ) g ( d m ) ,数论分块即可。
时间复杂度
O ( ( n + T ) n ) \mathcal{O}((n + T)\sqrt n) O (( n + T ) n ) 。
代码 。
首先,若有解则答案不超过
7 7 7 ,因为一个数最多有
6 6 6 个质因数,我们先选择任意数,再对它的每个质因数选择不含该质因数的数。
算法 1
设
f i , j f_{i, j} f i , j 表示大小为
i i i 且
gcd = j \gcd = j g cd= j 的子集数量。莫比乌斯反演,设
g i , j g_{i, j} g i , j 表示
gcd \gcd g cd 为
j j j 的倍数的子集数量,则
g i , j = c j i g_{i, j} = c_j ^ i g i , j = c j i ,其中
c j c_j c j 表示初始序列中
j j j 的倍数,则
f i , j = ∑ j ∣ k μ ( k j ) g i , k f_{i, j} = \sum_{j\mid k} \mu(\frac k j) g_{i, k} f i , j = ∑ j ∣ k μ ( j k ) g i , k ,即倍数容斥。
至此已经可以通过了,但取模不太好看。
算法 2
考虑在
f i − 1 f_{i - 1} f i − 1 的基础上添加一层
f 1 f_1 f 1 ,则
f i f_i f i 等于
f i − 1 f_{i - 1} f i − 1 和
f 1 f_1 f 1 做
gcd \gcd g cd 卷积,即
a i b j → c gcd ( i , j ) a_i b_j\to c_{\gcd(i, j)} a i b j → c g c d ( i , j ) 。这个可以直接倍数容斥。每做一次卷积就令
f i , j = [ f i , j > 0 ] f_{i, j} = [f_{i, j} > 0] f i , j = [ f i , j > 0 ] ,即修改
f f f 的定义为是否存在大小为
i i i 且
gcd = j \gcd = j g cd= j 的子集。这样值域就在平方范围内了,不需要取模。
两个算法本质相同,但是后者降低了值域范围。
视
n , a i n, a_i n , a i 同级。
i i i 的数量级为最大本质不同质因数数量
O ( log n log log n ) \mathcal{O}(\frac {\log n} {\log \log n}) O ( l o g l o g n l o g n ) ,每次暴力倍数容斥
O ( n ln n ) \mathcal{O}(n\ln n) O ( n ln n ) ,时间复杂度为
O ( n log 2 n log log n ) \mathcal{O}(\frac {n\log ^ 2 n} {\log\log n}) O ( l o g l o g n n l o g 2 n ) 。
代码 。
若容斥部分用狄利克雷前缀和实现则时间为
O ( n log n ) \mathcal{O}(n\log n) O ( n log n ) 。进一步地,将算法一的枚举改成二分,算法二的枚举改成倍增,时间复杂度
O ( n log ( log n log log n ) log log n ) \mathcal{O}(n\log(\frac {\log n}{\log \log n}) \log\log n) O ( n log ( l o g l o g n l o g n ) log log n ) 即
O ( n log 2 log n ) \mathcal{O}(n\log ^ 2\log n) O ( n log 2 log n ) 。
记
c = min ( n , m ) c = \min(n, m) c = min ( n , m ) 。
a n s w e r = ∏ i = 1 n ∏ j = 1 m f gcd ( i , j ) = ∏ d = 1 c f d ∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) = d ] = ∏ d = 1 c f d ∑ d ′ = 1 c d μ ( d ′ ) n d d ′ m d d ′ = ∏ T = 1 c ( ∏ d ∣ T f d μ ( n d ) ) n T m T . \begin{aligned}
\mathrm{answer} & = \prod_{i = 1} ^ n \prod_{j = 1} ^ m f_{\gcd(i, j)} \\
& = \prod_{d = 1} ^ c f_d ^ {\sum_{i = 1} ^ n \sum_{j = 1} ^ m [\gcd(i, j) = d]} \\
& = \prod_{d = 1} ^ c f_d ^ {\sum_{d' = 1} ^ \frac c d \mu(d') \frac n {dd'} \frac m {dd'}} \\
& = \prod_{T = 1} ^ c \left(\prod_{d\mid T} f_d ^ {\mu(\frac n d)} \right) ^ {\frac n T \frac m T}.
\end{aligned} answer = i = 1 ∏ n j = 1 ∏ m f g c d ( i , j ) = d = 1 ∏ c f d ∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = d ] = d = 1 ∏ c f d ∑ d ′ = 1 d c μ ( d ′ ) d d ′ n d d ′ m = T = 1 ∏ c d ∣ T ∏ f d μ ( d n ) T n T m .
预处理
f f f 及其逆元,预处理
g ( n ) = ∏ d ∣ n f d μ ( n d ) g(n) = \prod_{d\mid n} f_d ^ {\mu(\frac n d)} g ( n ) = ∏ d ∣ n f d μ ( d n ) 。
对每组询问数论分块即可做到
O ( n log n + T n log n ) \mathcal{O}(n\log n + T\sqrt n\log n) O ( n log n + T n log n ) 。
代码 。
一条直线由两个点确定。枚举第一个点和最后一个点得到每个维度的差值
x 1 ∼ n x_{1\sim n} x 1 ∼ n ,则中途(不含两端)经过的整点数量为
gcd ( x 1 ∼ n ) − 1 \gcd(x_{1\sim n}) - 1 g cd( x 1 ∼ n ) − 1 ,方案数为
( d − 1 c − 2 ) \binom {d - 1} {c - 2} ( c − 2 d − 1 ) 。考虑先枚举
x 1 ∼ n x_{1\sim n} x 1 ∼ n 再枚举两端的点,答案为
∑ x 1 ∼ n ( gcd ( x 1 ∼ n ) − 1 c − 2 ) ∏ i = 1 n ( m i − x i ) . = ∑ d = 1 M ( d − 1 c − 2 ) ∑ x 1 ∼ n [ gcd ( x 1 ∼ n ) = 1 ] ∏ i = 1 n ( m i − x i d ) = ∑ d = 1 M ( d − 1 c − 2 ) ∑ d ′ = 1 M / d μ ( d ′ ) ∏ i = 1 n ∑ x i = 1 m i / d d ′ ( m i − x i d d ′ ) = ∑ X = 1 M ∏ i = 1 n ∑ x i = 1 m i / X ( m i − x i X ) ∑ d ∣ X ( d − 1 c − 2 ) μ ( X d ) . \begin{aligned}
& \sum_{x_{1\sim n}} \binom {\gcd(x_{1\sim n}) - 1} {c - 2} \prod_{i = 1} ^ n (m_i - x_i). \\
= \; & \sum_{d = 1} ^ M \binom {d - 1} {c - 2} \sum_{x_{1\sim n}} [\gcd(x_{1\sim n}) = 1] \prod_{i = 1} ^ n (m_i - x_id) \\
= \; & \sum_{d = 1} ^ M \binom {d - 1} {c - 2} \sum_{d' = 1} ^ {M / d} \mu(d') \prod_{i = 1} ^ n \sum_{x_i = 1} ^ {m_i / dd'} (m_i - x_idd') \\
= \; & \sum_{X = 1} ^ M \prod_{i = 1} ^ n \sum_{x_i = 1} ^ {m_i / X} (m_i - x_iX) \sum_{d\mid X}\binom {d - 1} {c - 2} \mu\left(\frac X d\right). \\
\end{aligned} = = = x 1 ∼ n ∑ ( c − 2 g cd( x 1 ∼ n ) − 1 ) i = 1 ∏ n ( m i − x i ) . d = 1 ∑ M ( c − 2 d − 1 ) x 1 ∼ n ∑ [ g cd( x 1 ∼ n ) = 1 ] i = 1 ∏ n ( m i − x i d ) d = 1 ∑ M ( c − 2 d − 1 ) d ′ = 1 ∑ M / d μ ( d ′ ) i = 1 ∏ n x i = 1 ∑ m i / d d ′ ( m i − x i d d ′ ) X = 1 ∑ M i = 1 ∏ n x i = 1 ∑ m i / X ( m i − x i X ) d ∣ X ∑ ( c − 2 d − 1 ) μ ( d X ) .
于是问题分成两部分:
f ( X ) = ∏ i = 1 n ( m i k i − X k i ( k i + 1 ) / 2 ) , g ( X ) = ∑ d ∣ X ( d − 1 c − 2 ) μ ( X / d ) . \begin{aligned}
f(X) & = \prod_{i = 1} ^ n \left(m_i k_i - Xk_i(k_i + 1) / 2\right),\\
g(X) & = \sum_{d\mid X} \binom {d - 1} {c - 2} \mu(X / d).
\end{aligned} f ( X ) g ( X ) = i = 1 ∏ n ( m i k i − X k i ( k i + 1 ) /2 ) , = d ∣ X ∑ ( c − 2 d − 1 ) μ ( X / d ) .
其中
k i = ⌊ m i X ⌋ k_i = \lfloor \frac {m_i} X\rfloor k i = ⌊ X m i ⌋ 。
时间复杂度
O ( T ( n m + m log m ) ) \mathcal{O}(T(nm + m\log m)) O ( T ( nm + m log m )) ,需要卡常。
代码 。
注意到 c c c 比 T T T 小,可以 O ( c m log m ) \mathcal{O}(cm\log m) O ( c m log m ) 预处理 g ( c , X ) g(c, X) g ( c , X ) 。
整数除法很慢,我们需要计算 O ( n m ) \mathcal{O}(nm) O ( nm ) 次 k k k ,可以用数论分块优化到 O ( n 2 m ) \mathcal{O}(n ^ 2\sqrt m) O ( n 2 m ) 次。
瓶颈在
T n m Tnm T nm ,怎么优化?数论分块固定了所有
k i k_i k i 之后,
f ( X ) f(X) f ( X ) 是关于
X X X 的
n n n 次多项式。算出多项式,并预处理
i 0 ∼ n i ^ {0\sim n} i 0 ∼ n 的前缀和。直接算是
O ( n 2 ) \mathcal{O}(n ^ 2) O ( n 2 ) ,还要优化。在
k i k_i k i 改变时除掉原线性式,再乘以新线性式。注意线性式等于零的情况,记录有多少个零即可。
时间
O ( T n 2 m + c m log m ) \mathcal{O}(Tn ^ 2\sqrt m + cm\log m) O ( T n 2 m + c m log m ) 。
工作量极大的莫反练习题,有一定技术含量。
将
lcm ( i , j ) gcd ( i , k ) \frac {\operatorname{lcm} (i, j)} {\gcd(i, k)} g c d ( i , k ) lcm ( i , j ) 写成
i ⋅ j gcd ( i , j ) gcd ( i , k ) \frac {i \cdot j} {\gcd(i, j) \gcd(i, k)} g c d ( i , j ) g c d ( i , k ) i ⋅ j 。外层求积,可将问题拆成两部分:计算
∏ i f ( t y p e ) \prod i ^ {f(type)} ∏ i f ( t y p e ) 和
∏ gcd ( i , j ) f ( t y p e ) \prod \gcd(i, j) ^ {f(type)} ∏ g cd( i , j ) f ( t y p e ) ,于是本题变成了无聊的六合一。
记
F ( n , m ) = ∑ i = 1 n ∑ j = 1 m [ i ⊥ j ] F(n, m) = \sum_{i = 1} ^ n \sum_{j = 1} ^ m [i\perp j] F ( n , m ) = ∑ i = 1 n ∑ j = 1 m [ i ⊥ j ] 。
∏ i , j , k i = ∏ i i B C . {\color{red}\prod_{i, j, k} i} = \prod_{i} i ^ {BC}. i , j , k ∏ i = i ∏ i BC .
预处理阶乘,复杂度
O ( log N ) \mathcal{O}(\log N) O ( log N ) 。
∏ i , j , k gcd ( i , j ) = ∏ d = 1 min ( A , B ) d F ( A d , B d ) C = ∏ d = 1 min ( A , B ) d ∑ d ′ = 1 min ( A , B ) d μ ( d ′ ) A d d ′ B d d ′ C = ∏ T = 1 min ( A , B ) ( ∏ d ∣ T d μ ( T d ) ) A T B T C . \begin{aligned}
{\color{red}\prod_{i, j, k} \gcd(i, j)} &= \prod_{d = 1} ^ {\min(A, B)} d ^ {F(\frac A d, \frac B d) C} \\
& = \prod_{d = 1} ^ {\min(A, B)} d ^ {\sum_{d' = 1} ^ {\frac {\min(A, B)} d} \mu(d') \frac {A} {dd'} \frac {B} {dd'} C} \\
& = \prod_{T = 1} ^ {\min(A, B)} \left(\prod_{d\mid T} d ^ {\mu(\frac T d)}\right) ^ {\frac A T\frac B T C}.
\end{aligned} i , j , k ∏ g c d ( i , j ) = d = 1 ∏ m i n ( A , B ) d F ( d A , d B ) C = d = 1 ∏ m i n ( A , B ) d ∑ d ′ = 1 d m i n ( A , B ) μ ( d ′ ) d d ′ A d d ′ B C = T = 1 ∏ m i n ( A , B ) d ∣ T ∏ d μ ( d T ) T A T B C .
预处理
f T = ∏ d ∣ T d μ ( T d ) f_T = \prod_{d\mid T} d ^ {\mu(\frac T d)} f T = ∏ d ∣ T d μ ( d T ) 。对
A , B A, B A , B 数论分块时需计算一段区间的
f T f_T f T 的积,故预处理
f T f_T f T 的前缀积和
f T f_T f T 前缀积的逆元。时间复杂度
O ( N log N ) \mathcal{O}(\sqrt N\log N) O ( N log N ) 。
∏ i , j , k i i j k = ∏ i ( i i ) S ( B ) S ( C ) . {\color{red}\prod_{i, j, k} i ^ {ijk}} = \prod_{i} (i ^ i) ^ {S(B)S(C)}. i , j , k ∏ i ijk = i ∏ ( i i ) S ( B ) S ( C ) .
其中
S ( n ) = ∑ i = 1 n i = ( n + 1 2 ) S(n) = \sum_{i = 1} ^ n i = \binom {n + 1} 2 S ( n ) = ∑ i = 1 n i = ( 2 n + 1 ) 。预处理
i i i ^ i i i 的前缀积,复杂度
O ( log N ) \mathcal{O}(\log N) O ( log N ) 。
∏ i , j , k gcd ( i , j ) i j k = ∏ d = 1 min ( A , B ) d d 2 d ′ 2 S ( C ) ∑ d ′ = 1 min ( A , B ) d μ ( d ′ ) S ( A d d ′ ) S ( B d d ′ ) = ∏ T = 1 min ( A , B ) ( ∏ d ∣ T d T 2 μ ( T d ) ) S ( A T ) S ( B T ) S ( C ) . \begin{aligned}
{\color{red}\prod_{i, j, k} \gcd(i, j) ^ {ijk}} & = \prod_{d = 1} ^ {\min(A, B)} d ^ {d ^ 2{d'} ^ 2S(C) \sum_{d' = 1} ^ {\frac {\min(A, B)} {d}} \mu(d') S(\frac A {dd'}) S(\frac {B}{dd'})} \\
& = \prod_{T = 1} ^ {\min(A, B)} \left(\prod_{d \mid T} d ^ {T ^ 2 \mu(\frac T d)} \right) ^ {S(\frac A T) S(\frac B T) S(C)}.
\end{aligned} i , j , k ∏ g c d ( i , j ) ijk = d = 1 ∏ m i n ( A , B ) d d 2 d ′ 2 S ( C ) ∑ d ′ = 1 d m i n ( A , B ) μ ( d ′ ) S ( d d ′ A ) S ( d d ′ B ) = T = 1 ∏ m i n ( A , B ) d ∣ T ∏ d T 2 μ ( d T ) S ( T A ) S ( T B ) S ( C ) .
预处理
f T ′ = f T T 2 f'_T = f_T ^ {T ^ 2} f T ′ = f T T 2 ,
f ′ f' f ′ 的前缀积和
f ′ f' f ′ 前缀积的逆元。时间复杂度
O ( N log N ) \mathcal{O}(\sqrt N\log N) O ( N log N ) 。
∏ i = 1 A ∏ j = 1 B ∏ k = 1 C i gcd ( i , j , k ) . {\color{red}\prod_{i = 1} ^ A \prod_{j = 1} ^ B \prod_{k = 1} ^ C i ^ {\gcd(i, j, k)}}. i = 1 ∏ A j = 1 ∏ B k = 1 ∏ C i g c d ( i , j , k ) .
记
L = min ( A , B , C ) L = \min(A, B, C) L = min ( A , B , C ) ,枚举最大公约数
d d d ,得到
∏ d = 1 L ∏ i = 1 A d ( i d ) d ∑ j = 1 B d ∑ k = 1 C d [ gcd ( i , j , k ) = 1 ] . \prod_{d = 1} ^ {L} \prod_{i = 1} ^ {\frac A d} (id) ^ {d \sum_{j = 1} ^ {\frac B d} \sum_{k = 1} ^ {\frac C d} [\gcd(i, j, k) = 1]}. d = 1 ∏ L i = 1 ∏ d A ( i d ) d ∑ j = 1 d B ∑ k = 1 d C [ g c d ( i , j , k ) = 1 ] .
莫比乌斯反演
∏ d = 1 L ∏ i = 1 A d ( i d ) d ∑ j = 1 B d ∑ k = 1 C d ∑ d ′ ∣ gcd ( i , j , k ) μ ( d ′ ) = ∏ d = 1 L ∏ d ′ = 1 L d ∏ i = 1 A d d ′ ( i d d ′ ) d ∑ j = 1 B d d ′ ∑ k = 1 C d d ′ μ ( d ′ ) . \begin{aligned}
& \prod_{d = 1} ^ {L} \prod_{i = 1} ^ {\frac A d} (id) ^ {d \sum_{j = 1} ^ {\frac B d} \sum_{k = 1} ^ {\frac C d} \sum_{d' \mid \gcd(i, j, k)} \mu(d')} \\
= \, &\prod_{d = 1} ^ {L} \prod_{d' = 1} ^ {\frac L d} \prod_{i = 1} ^ {\frac A {dd'}} (idd') ^ {d \sum_{j = 1} ^ {\frac B {dd'}} \sum_{k = 1} ^ {\frac C {dd'}} \mu(d')}.
\end{aligned} = d = 1 ∏ L i = 1 ∏ d A ( i d ) d ∑ j = 1 d B ∑ k = 1 d C ∑ d ′ ∣ g c d ( i , j , k ) μ ( d ′ ) d = 1 ∏ L d ′ = 1 ∏ d L i = 1 ∏ d d ′ A ( i d d ′ ) d ∑ j = 1 d d ′ B ∑ k = 1 d d ′ C μ ( d ′ ) .
令
T = d d ′ T = dd' T = d d ′ ,
D = A T D = \frac {A} T D = T A ,整理
∏ T = 1 L ∏ d ∣ T ( ∏ i = 1 A T ( i T ) d μ ( T d ) ) B T C T = ∏ T = 1 L ∏ d ∣ T ( D ! ⋅ T D ) d μ ( T d ) B T C T = ∏ T = 1 L ( D ! ⋅ T D ) ( ∑ d ∣ T d μ ( T d ) ) B T C T = ∏ T = 1 L ( D ! ⋅ T D ) φ ( T ) B T C T . \begin{aligned}
& \prod_{T = 1} ^ {L} \prod_{d \mid T} \left(\prod_{i = 1} ^ {\frac A T} (iT) ^ {d\mu(\frac T d)}\right) ^ {\frac B {T} \frac C {T}} \\
= \, & \prod_{T = 1} ^ {L} \prod_{d \mid T} (D! \cdot T ^ D) ^ {d\mu(\frac T d)\frac B {T} \frac C {T}} \\
= \, & \prod_{T = 1} ^ {L} (D! \cdot T ^ D) ^ {\left(\sum_{d\mid T} d\mu(\frac T d)\right)\frac B {T} \frac C {T}} \\
= \, & \prod_{T = 1} ^ {L} \left(D! \cdot T ^ {D}\right) ^ { \varphi(T) \frac B {T} \frac C {T}}.
\end{aligned} = = = T = 1 ∏ L d ∣ T ∏ i = 1 ∏ T A ( i T ) d μ ( d T ) T B T C T = 1 ∏ L d ∣ T ∏ ( D ! ⋅ T D ) d μ ( d T ) T B T C T = 1 ∏ L ( D ! ⋅ T D ) ( ∑ d ∣ T d μ ( d T ) ) T B T C T = 1 ∏ L ( D ! ⋅ T D ) φ ( T ) T B T C .
数论分块时,对
D ! D! D ! 需要求一段区间的
φ ( T ) \varphi(T) φ ( T ) 之和,对
T T T 需要求一段区间的
T φ ( T ) T ^ {\varphi(T)} T φ ( T ) 之积,均可预处理。时间复杂度
O ( N log N ) \mathcal{O}(\sqrt N\log N) O ( N log N ) 。
∏ i = 1 A ∏ j = 1 B ∏ k = 1 C gcd ( i , j ) gcd ( i , j , k ) . {\color{red}\prod_{i = 1} ^ A \prod_{j = 1} ^ B \prod_{k = 1} ^ C \gcd(i, j) ^ {\gcd(i, j, k)}}. i = 1 ∏ A j = 1 ∏ B k = 1 ∏ C g c d ( i , j ) g c d ( i , j , k ) .
令
L = min ( A , B ) L = \min(A, B) L = min ( A , B ) ,对
gcd ( i , j ) \gcd(i, j) g cd( i , j ) 莫比乌斯反演
∏ d = 1 L d ∑ k = 1 C gcd ( d , k ) F ( A d , B d ) . \prod_{d = 1} ^ {L} d ^ {\sum_{k = 1} ^ {C} \gcd(d, k) F(\frac A d, \frac B d)}. d = 1 ∏ L d ∑ k = 1 C g c d ( d , k ) F ( d A , d B ) .
这里已经可以做了:容易推出
∑ k = 1 C gcd ( d , k ) = ∑ T ∣ d φ ( T ) C T \sum_{k = 1} ^ C \gcd(d, k) = \sum_{T\mid d} \varphi(T) \frac C T ∑ k = 1 C g cd( d , k ) = ∑ T ∣ d φ ( T ) T C (结论 4),而所有
F ( A d , B d ) F(\frac A d, \frac B d) F ( d A , d B ) 可以数论分块套数论分块做到
O ( N 3 4 ) \mathcal{O}(N ^ {\frac 3 4}) O ( N 4 3 ) ,于是复杂度为
O ( N log N ) \mathcal{O}(N\log N) O ( N log N ) ,需要大力卡常。
将结论套入:
∏ T = 1 L ( ∏ T ′ ∣ T T φ ( T ′ ) C T ′ ) F ( A T , B T ) . \prod_{T = 1} ^ L \left(\prod_{T'\mid T} T ^ {\varphi(T') \frac C {T'}}\right) ^ {F\left(\frac {A} {T}, \frac {B} {T}\right)}. T = 1 ∏ L T ′ ∣ T ∏ T φ ( T ′ ) T ′ C F ( T A , T B ) .
设新的
T T T 等于原来的
T T ′ \frac T {T'} T ′ T ,则
∏ T ′ = 1 L ∏ T = 1 L T ′ ( T T ′ ) φ ( T ′ ) C T ′ F ( A T T ′ , B T T ′ ) . \prod_{T' = 1} ^ L \prod_{T = 1} ^ {\frac L {T'}} (TT') ^ {\varphi(T') \frac C {T'} F\left(\frac {A} {TT'}, \frac {B} {TT'}\right)}. T ′ = 1 ∏ L T = 1 ∏ T ′ L ( T T ′ ) φ ( T ′ ) T ′ C F ( T T ′ A , T T ′ B ) .
∏ T ′ = 1 L ( ∏ T = 1 L T ′ T F ( A T T ′ , B T T ′ ) ) φ ( T ′ ) C T ′ , \prod_{T' = 1} ^ L \left(\prod_{T = 1} ^ {\frac L {T'}} T ^ {F\left(\frac {A} {TT'}, \frac {B} {TT'}\right)}\right) ^ {\varphi(T') \frac C {T'}}, T ′ = 1 ∏ L T = 1 ∏ T ′ L T F ( T T ′ A , T T ′ B ) φ ( T ′ ) T ′ C ,
和
∏ T ′ = 1 L ( T ′ φ ( T ′ ) C T ′ ) ∑ T = 1 L T ′ F ( A T T ′ , B T T ′ ) . \prod_{T' = 1} ^ L \left( {T'} ^ {\varphi(T') \frac C {T'}}\right) ^ {\sum_{T = 1} ^ {\frac L {T'}}F\left(\frac {A} {TT'}, \frac {B} {TT'}\right)}. T ′ = 1 ∏ L ( T ′ φ ( T ′ ) T ′ C ) ∑ T = 1 T ′ L F ( T T ′ A , T T ′ B ) .
注意到
∑ i = 1 min ( A , B ) F ( A i , B i ) = A B \sum_{i = 1} ^ {\min(A, B)} F(\frac A i, \frac B i) = AB ∑ i = 1 m i n ( A , B ) F ( i A , i B ) = A B ,因为每一对
A , B A, B A , B 会在
i = gcd ( A , B ) i = \gcd(A, B) i = g cd( A , B ) 时计入答案,于是后面的部分为
∏ T ′ = 1 L T ′ φ ( T ′ ) C T ′ A T ′ B T ′ . \prod_{T' = 1} ^ L {T'} ^ {\varphi(T') \frac C {T'}\frac {A} {T'} \frac {B} {T'}}. T ′ = 1 ∏ L T ′ φ ( T ′ ) T ′ C T ′ A T ′ B .
类似上一部分做,复杂度
O ( N log N ) \mathcal{O}(\sqrt N\log N) O ( N log N ) 。
再把前面这部分写下来。
∏ T ′ = 1 L ( ∏ T = 1 L T ′ T F ( A T T ′ , B T T ′ ) ) φ ( T ′ ) C T ′ . \prod_{T' = 1} ^ L \left(\prod_{T = 1} ^ {\frac L {T'}} T ^ {F\left(\frac {A} {TT'}, \frac {B} {TT'}\right)}\right) ^ {\varphi(T') \frac C {T'}}. T ′ = 1 ∏ L T = 1 ∏ T ′ L T F ( T T ′ A , T T ′ B ) φ ( T ′ ) T ′ C .
首先在外层对
T ′ T' T ′ 做关于
A , B , C A, B, C A , B , C 的三维数论分块,此时内层的
∏ T = 1 L T ′ T F ( A T T ′ , B T T ′ ) \prod_{T = 1} ^ {\frac L {T'}} T ^ {F\left(\frac {A} {TT'}, \frac {B} {TT'}\right)} T = 1 ∏ T ′ L T F ( T T ′ A , T T ′ B )
为定值。如果能快速计算,则它的
C T ′ ∑ φ ( T ′ ) \frac {C} {T'}\sum \varphi(T') T ′ C ∑ φ ( T ′ ) 次幂就是当前
T ′ T' T ′ 区间的答案。
F F F 可以数论分块根号求(P2522),于是对
T T T 数论分块之后就是数论分块套数论分块套数论分块,时间
O ( N 7 8 ) \mathcal{O}(N ^ {\frac 7 8}) O ( N 8 7 ) ,不优美。
注意到
F ( A T T ′ , B T T ′ ) F(\frac A {TT'}, \frac B {TT'}) F ( T T ′ A , T T ′ B ) 在整个过程中只有
O ( L ) \mathcal{O}(\sqrt L) O ( L ) 种不同的取值,可以先数论分块套数论分块预处理,即可
O ( 1 ) \mathcal{O}(1) O ( 1 ) 求出
F ( A T T ′ , B B B ′ ) F(\frac {A} {TT'}, \frac {B} {BB'}) F ( T T ′ A , B B ′ B ) 。
对
T T T 数论分块,时间为数论分块套数论分块结合内层快速幂的
O ( N 3 4 log N ) \mathcal{O}(N ^ {\frac 3 4}\log N) O ( N 4 3 log N ) 。
综上,预处理复杂度为
O ( N log N ) \mathcal{O}(N\log N) O ( N log N ) ,单次询问的复杂度为
O ( N 3 4 log N ) \mathcal{O}(N ^ {\frac 3 4}\log N) O ( N 4 3 log N ) 。可能可以进行更多预处理以达到更优秀的复杂度。
本题的启发:
写成 ∑ T = 1 n ∑ d ∣ T \sum_{T = 1} ^ n \sum _{d\mid T} ∑ T = 1 n ∑ d ∣ T 方便预处理,写成 ∑ T = 1 n ∑ d = 1 n T \sum_{T = 1} ^ n \sum_{d = 1} ^ {\frac n T} ∑ T = 1 n ∑ d = 1 T n 方便直接求 。
不要急着把一大坨式子展开,说不定可以预处理 。
∑ i = 1 n ∑ j = 1 m φ ( i j gcd 2 ( i , j ) ) = ∑ i = 1 n ∑ j = 1 m φ ( i gcd ( i , j ) ) φ ( j gcd ( i , j ) ) = ∑ d = 1 m ∑ i = 1 n d ∑ j = 1 m d φ ( i ) φ ( j ) [ i ⊥ j ] = ∑ d = 1 m ∑ d ′ = 1 m d μ ( d ′ ) ∑ i = 1 n d d ′ ∑ j = 1 m d d ′ φ ( i d ′ ) φ ( j d ′ ) = ∑ T = 1 m ∑ d ∣ T μ ( d ) ( ∑ i = 1 n T φ ( i d ) ) ( ∑ j = 1 m T φ ( j d ) ) . \begin{aligned}
& \sum_{i = 1} ^ n \sum_{j = 1} ^ m \varphi\left( \frac {i j} {\gcd ^ 2(i, j)}\right) \\
= \; & \sum_{i = 1} ^ n \sum_{j = 1} ^ m \varphi\left( \frac {i} {\gcd(i, j)}\right) \varphi\left( \dfrac {j} {\gcd(i, j)}\right) \\
= \; & \sum_{d = 1} ^ m \sum_{i = 1} ^ {\frac n d} \sum_{j = 1} ^ {\frac m d} \varphi(i) \varphi(j) [i\perp j] \\
= \; & \sum_{d = 1} ^ m \sum_{d' = 1} ^ {\frac m d} \mu(d') \sum_{i = 1} ^ {\frac n {dd'}} \sum_{j = 1} ^ {\frac m {dd'}} \varphi(id') \varphi(jd') \\
= \; & \sum_{T = 1} ^ m \sum_{d\mid T} \mu(d) \left(\sum_{i = 1} ^ {\frac n T} \varphi(id) \right) \left(\sum_{j = 1} ^ {\frac m T} \varphi(jd) \right).
\end{aligned} = = = = i = 1 ∑ n j = 1 ∑ m φ ( g cd2 ( i , j ) ij ) i = 1 ∑ n j = 1 ∑ m φ ( g cd( i , j ) i ) φ ( g cd( i , j ) j ) d = 1 ∑ m i = 1 ∑ d n j = 1 ∑ d m φ ( i ) φ ( j ) [ i ⊥ j ] d = 1 ∑ m d ′ = 1 ∑ d m μ ( d ′ ) i = 1 ∑ d d ′ n j = 1 ∑ d d ′ m φ ( i d ′ ) φ ( j d ′ ) T = 1 ∑ m d ∣ T ∑ μ ( d ) i = 1 ∑ T n φ ( i d ) j = 1 ∑ T m φ ( j d ) .
求出不大于某值的所有
d d d 的倍数的
φ \varphi φ 之和的形式出现多次,所以首先
O ( n ln n ) \mathcal{O}(n\ln n) O ( n ln n ) 预处理
f ( d , s ) f(d, s) f ( d , s ) 表示
∑ i = 1 s φ ( i d ) \sum_{i = 1} ^ s \varphi(id) ∑ i = 1 s φ ( i d ) 。
计算单个
T T T 的复杂度为
d ( T ) d(T) d ( T ) ,且当
T T T 大的时候,
n T \frac n T T n 和
m T \frac m T T m 较小,所以我们考虑根号分治。
对于
T ≤ n T\leq \sqrt n T ≤ n ,直接暴力枚举
T , d T, d T , d 计算
∑ T = 1 m ∑ d ∣ T μ ( d ) f ( d , n T ) f ( d , m T ) \sum_{T = 1} ^ m \sum_{d\mid T} \mu(d) f(d, \frac n T) f(d, \frac m T) ∑ T = 1 m ∑ d ∣ T μ ( d ) f ( d , T n ) f ( d , T m ) 。单组询问
O ( n log n ) \mathcal{O}(\sqrt n \log n) O ( n log n ) 。
对于
T ≥ n T \geq \sqrt n T ≥ n ,
n T ≤ n \frac n T\leq \sqrt n T n ≤ n ,预处理
g ( i , j , s ) g(i, j, s) g ( i , j , s ) 表示
∑ T = 1 s ∑ d ∣ T μ ( d ) f ( d , i ) f ( d , j ) \sum_{T = 1} ^ s \sum_{d\mid T} \mu(d)f(d, i) f(d, j) ∑ T = 1 s ∑ d ∣ T μ ( d ) f ( d , i ) f ( d , j ) ,则一段使得整除值
n T \frac n T T n 和
m T \frac m T T m 相同的
T ∈ [ l , r ] T\in [l, r] T ∈ [ l , r ] 的贡献可直接表示为
g ( n T , m T , r ) − g ( n T , m T , l − 1 ) g(\frac n T, \frac m T, r) - g(\frac n T, \frac m T, l - 1) g ( T n , T m , r ) − g ( T n , T m , l − 1 ) 。注意到
i ≥ j i \geq j i ≥ j 且
s s s 的上界为
n i \frac n i i n (要使
n T = i \frac n T = i T n = i ,则
T T T 不会超过
n n n 的最大值除以
i i i ),所以对于每个
i i i 的
( j , s ) (j, s) ( j , s ) 对数为
i × n i = n i\times \frac n i = n i × i n = n 。对每个
i ≤ n i\leq \sqrt n i ≤ n 预处理
g ( i , j , s ) g(i, j, s) g ( i , j , s ) ,空间复杂度
O ( n n ) \mathcal{O}(n\sqrt n) O ( n n ) ,时间复杂度
O ( n n log n ) \mathcal{O}(n\sqrt n\log n) O ( n n log n ) 或
O ( n n log log n ) \mathcal{O}(n\sqrt n \log\log n) O ( n n log log n ) 。每组询问内求答案则是直接数论分块。
综上,时间复杂度
O ( ( n + T ) n log n ) \mathcal{O}((n + T)\sqrt n\log n) O (( n + T ) n log n ) 。
代码 。
类似结论 4 的思路,
d ( i j k ) = ∑ x ∣ i ∑ y ∣ j ∑ z ∣ k [ x ⊥ y ] [ x ⊥ z ] [ y ⊥ z ] . d(ijk) = \sum_{x \mid i} \sum_{y\mid j} \sum_{z\mid k} [x\perp y][x\perp z][y\perp z]. d ( ijk ) = x ∣ i ∑ y ∣ j ∑ z ∣ k ∑ [ x ⊥ y ] [ x ⊥ z ] [ y ⊥ z ] .
因此答案可写为
∑ i = 1 A ∑ j = 1 B ∑ k = 1 C [ i ⊥ j ] [ i , j ⊥ k ] A i B j C k . \sum_{i = 1} ^ A \sum_{j = 1} ^ B \sum_{k = 1} ^ C[i\perp j][i, j\perp k] \frac A i \frac B j\frac C k. i = 1 ∑ A j = 1 ∑ B k = 1 ∑ C [ i ⊥ j ] [ i , j ⊥ k ] i A j B k C .
形式比较复杂,先做一次关于
i , j i, j i , j 的莫反试试水。
∑ d = 1 min ( A , B ) μ ( d ) ∑ i = 1 A d ∑ j = 1 B d ∑ k = 1 C [ i , j , d ⊥ k ] A i d B j d C k . \sum_{d = 1} ^ {\min(A, B)} \mu(d) \sum_{i = 1} ^ {\frac A d} \sum_{j = 1} ^ {\frac B d} \sum_{k = 1} ^ C [i, j, d \perp k] \frac A {id} \frac B {jd} \frac C k. d = 1 ∑ m i n ( A , B ) μ ( d ) i = 1 ∑ d A j = 1 ∑ d B k = 1 ∑ C [ i , j , d ⊥ k ] i d A j d B k C .
看起来相当不可做。不要忘记我们做莫反的核心目的是将
i , j i, j i , j 独立开来,同时注意到所有互质的条件均和
k k k 有关,所以先枚举
k k k ,得到
∑ k = 1 C ∑ d = 1 min ( A , B ) [ d ⊥ k ] μ ( d ) ( ∑ i = 1 A d [ i ⊥ k ] A i d ) ( ∑ j = 1 B d [ j ⊥ k ] B j d ) . \sum_{k = 1} ^ {C} \sum_{d = 1} ^ {\min(A, B)} [d\perp k]\mu(d) \left(\sum_{i = 1} ^ {\frac A d} [i\perp k]\frac A {id}\right) \left(\sum_{j = 1} ^ {\frac B d} [j\perp k] \frac B {jd} \right). k = 1 ∑ C d = 1 ∑ m i n ( A , B ) [ d ⊥ k ] μ ( d ) i = 1 ∑ d A [ i ⊥ k ] i d A j = 1 ∑ d B [ j ⊥ k ] j d B .
f ( k , n ) = ∑ i = 1 n [ i ⊥ k ] n i , f(k, n) = \sum_{i = 1} ^ n [i\perp k] \frac n i, f ( k , n ) = i = 1 ∑ n [ i ⊥ k ] i n ,
则
∑ k = 1 C ∑ d = 1 min ( A , B ) [ d ⊥ k ] μ ( d ) f ( k , A / d ) f ( k , B / d ) . \sum_{k = 1} ^ C \sum_{d = 1} ^ {\min(A, B)} [d\perp k] \mu(d) f(k, A / d ) f(k, B / d). k = 1 ∑ C d = 1 ∑ m i n ( A , B ) [ d ⊥ k ] μ ( d ) f ( k , A / d ) f ( k , B / d ) .
注意到
f f f 的第二维只能是
A A A 或
B B B 的整除值,所以共有
O ( V V ) \mathcal{O}(V \sqrt V) O ( V V ) 对
( k , n ) (k, n) ( k , n ) 二元组,且二维数论分块后问题转化为求
∑ d = l r [ d ⊥ k ] μ ( d ) . \sum_{d = l} ^ r [d\perp k] \mu(d). d = l ∑ r [ d ⊥ k ] μ ( d ) .
设
g ( k , n ) = ∑ d = 1 n [ d ⊥ k ] μ ( d ) , g(k, n) = \sum_{d = 1} ^ n [d\perp k] \mu(d), g ( k , n ) = d = 1 ∑ n [ d ⊥ k ] μ ( d ) ,
则
n n n 是所有使得整除值相等的区间右端点,所以
n n n 本身也是
A A A 或
B B B 的整除值。
可以直接莫反求
f , g f, g f , g ,需要预处理以加速计算。例如
f ( k , n ) = ∑ d ∣ k μ ( d ) ∑ i = 1 n d n i d . f(k, n) = \sum_{d\mid k} \mu(d) \sum_{i = 1} ^ {\frac n d} \frac n {id}. f ( k , n ) = d ∣ k ∑ μ ( d ) i = 1 ∑ d n i d n .
需要预处理
h ( n ) = ∑ i = 1 n n i h(n) = \sum_{i = 1} ^ n \frac n i h ( n ) = ∑ i = 1 n i n 。时间
O ( V V log V ) \mathcal{O}(V\sqrt V\log V) O ( V V log V ) ,
代码 。洛谷评测机较慢,无法通过。
f ( k , n ) = ∑ i = 1 n [ i ⊥ k ] n i . f(k, n) = \sum_{i = 1} ^ n [i\perp k] \frac n i. f ( k , n ) = i = 1 ∑ n [ i ⊥ k ] i n .
k = 1 k = 1 k = 1 时显然
f ( 1 , n ) = h ( n ) f(1, n) = h(n) f ( 1 , n ) = h ( n ) 。否则,我们将
k k k 除掉任意质因数
p p p ,考虑在
f ( k p , n ) f(\frac k p, n) f ( p k , n ) 的基础上还要去掉哪些
i i i 的贡献:
i ⊥ k p i\perp \frac k p i ⊥ p k 但
i ⊥̸ k i\not\perp k i ⊥ k 。如果
k p \frac k p p k 本身就是
p p p 的倍数,显然不变。否则
i i i 肯定得是
p p p 的倍数,且
i ⊥ k p i\perp \frac k p i ⊥ p k 即
i p ⊥ k p \frac i p \perp \frac k p p i ⊥ p k (因为
k p \frac k p p k 不含
p p p ,可以放心地除掉
i i i 里面的
p p p ),所以
f ( k , n ) = f ( k / p , n ) − [ p ∤ k / p ] ∑ i = 1 n p [ i ⊥ k / p ] n i p = f ( k / p , n ) − [ p ∤ k / p ] f ( k / p , n / p ) . \begin{aligned}
f(k, n) & = f(k/ p, n) - [p\nmid k / p]\sum_{i = 1} ^ {\frac n p} [i\perp k / p] \frac n {ip} \\
& = f(k / p, n) - [p\nmid k / p] f(k / p, n / p).
\end{aligned} f ( k , n ) = f ( k / p , n ) − [ p ∤ k / p ] i = 1 ∑ p n [ i ⊥ k / p ] i p n = f ( k / p , n ) − [ p ∤ k / p ] f ( k / p , n / p ) .
类似地,
g ( k , n ) = g ( k / p , n ) − [ p ∤ k / p ] ∑ i = 1 n p [ i ⊥ k / p ] μ ( i p ) = g ( k / p , n ) − [ p ∤ k / p ] ∑ i = 1 n p [ i ⊥ k / p ] μ ( i ) μ ( p ) [ i ⊥ p ] = g ( k / p , n ) + [ p ∤ k / p ] ∑ i = 1 n p [ i ⊥ k / p ∧ i ⊥ p ] μ ( i ) = g ( k / p , n ) + [ p ∤ k / p ] g ( k , n / p ) . \begin{aligned}
g(k, n) & = g(k / p, n) - [p\nmid k / p] \sum_{i = 1} ^ {\frac n p} [i\perp k / p] \mu(ip) \\
& = g(k / p, n) - [p\nmid k / p] \sum_{i = 1} ^ {\frac n p} [i\perp k / p] \mu(i)\mu(p)[i\perp p] \\
& = g(k / p, n) + [p\nmid k / p] \sum_{i = 1} ^ {\frac n p} [i\perp k / p\land i\perp p] \mu(i) \\
& = g(k / p, n) + [p\nmid k / p] g(k, n / p).
\end{aligned} g ( k , n ) = g ( k / p , n ) − [ p ∤ k / p ] i = 1 ∑ p n [ i ⊥ k / p ] μ ( i p ) = g ( k / p , n ) − [ p ∤ k / p ] i = 1 ∑ p n [ i ⊥ k / p ] μ ( i ) μ ( p ) [ i ⊥ p ] = g ( k / p , n ) + [ p ∤ k / p ] i = 1 ∑ p n [ i ⊥ k / p ∧ i ⊥ p ] μ ( i ) = g ( k / p , n ) + [ p ∤ k / p ] g ( k , n / p ) .
空间是
O ( V V ) \mathcal{O}(V\sqrt V) O ( V V ) ,具体分析一下大约是
3 V V 3V\sqrt V 3 V V (
1 ∼ V 1\sim \sqrt V 1 ∼ V ,
a , b a, b a , b 的大于
V \sqrt V V 的整除值),还要开
f , g f, g f , g 两个数组,不够用。
注意到递推时
k k k 这个维度仅和
k / p k / p k / p 有关(来自
LHF 的题解),因此考虑按添加质因数的方式枚举
k k k ,就可以用
O ( ω ( V ) ) \mathcal{O}(\omega(V)) O ( ω ( V )) 个线性数组存下信息。
时间复杂度
O ( V V ) \mathcal{O}(V\sqrt V) O ( V V ) 。
代码 。