0x00 前言
本文(可能)包含的内容:
学习数论的前置知识
各类数论函数与其性质(和证明)
如何使用各类筛求积性函数值
在 OI 题目中的应用
参考资料:
阅读本文您应该有初中数学水平,如果没有建议阅读初一至初三的数学书。
如果文中有数学记号或专有名词您不懂其意思,请看 0xF0 附件。
0x01 数学杂项
狄利克雷卷积
定义:对于两个数论函数 f , g f , g ,他们的狄利克雷卷积 ( f ∗ g ) ( n ) = ∑ d | n f ( n ) g ( n d ) ( f ∗ g ) ( n ) = ∑ d | n f ( n ) g ( n d ) ,即 ( f ∗ g ) ( n ) = ∑ a b = n f ( a ) g ( b ) ( f ∗ g ) ( n ) = ∑ a b = n f ( a ) g ( b )
性质:两个积性函数 f , g f , g 的狄利克雷卷积也是积性函数。
证明:设 h h 为 f , g f , g 的狄利克雷卷积,即 h ( n ) = ∑ d | n f ( n ) g ( n d ) h ( n ) = ∑ d | n f ( n ) g ( n d ) ,g c d ( x , y ) = 1 g c d ( x , y ) = 1
h ( x ) h ( y ) = ∑ i | x f ( i ) g ( x i ) ∑ j | y f ( j ) g ( y j ) = ∑ i | x ∑ j | y f ( i ) f ( j ) g ( x i ) g ( y j ) = ∑ i | x ∑ j | y f ( i j ) g ( x y i j ) = ∑ d | x y f ( d ) g ( x y d ) = h ( x y ) h ( x ) h ( y ) = ∑ i | x f ( i ) g ( x i ) ∑ j | y f ( j ) g ( y j ) = ∑ i | x ∑ j | y f ( i ) f ( j ) g ( x i ) g ( y j ) = ∑ i | x ∑ j | y f ( i j ) g ( x y i j ) = ∑ d | x y f ( d ) g ( x y d ) = h ( x y )
证毕。
0x10 数论函数
本 part 记录了几种常见的数论函数及其性质(和证明),有一些过于简单的会放在 0xF2 中。
0x11 欧拉函数
欧拉函数,符号为 φ φ ,意为 φ ( n ) = n − 1 ∑ i = 1 [ gcd ( i , n ) = 1 ] φ ( n ) = ∑ i = 1 n − 1 [ gcd ( i , n ) = 1 ] ,即所有小于 n n 的数中有几个数和 n n 互质。
接下来是性质(和证明),设 p ∈ p r i m e p ∈ p r i m e
性质1 : φ ( p ) = p − 1 φ ( p ) = p − 1 ,证明显然。
性质2 :φ ( p k ) = p k − p k − 1 ( k ∈ Z + ) φ ( p k ) = p k − p k − 1 ( k ∈ Z + )
证明:p k p k 有且仅有质因数 p p ,而比它小的 p k − 1 − 1 p k − 1 − 1 个数中,也存在几个数含有质因数 p p :
p , 2 p , 3 p , ⋯ , ( p k − 1 − 1 ) p p , 2 p , 3 p , ⋯ , ( p k − 1 − 1 ) p ,一共有 p k − 1 − 1 p k − 1 − 1 个数。
于是在 1 ∼ p k − 1 1 ∼ p k − 1 中,与 p k p k 互质的数的个数为 ( p k − 1 ) − ( p k − 1 − 1 ) = p k − p k − 1 ( p k − 1 ) − ( p k − 1 − 1 ) = p k − p k − 1 。
证毕。
性质3 :φ ( a x ) = a φ ( x ) ( a | x ) φ ( a x ) = a φ ( x ) ( a | x )
性质4 :φ ( x ) φ ( y ) = φ ( x y ) ( gcd ( x , y ) = 1 ) φ ( x ) φ ( y ) = φ ( x y ) ( gcd ( x , y ) = 1 ) ,所以欧拉函数是积性函数。
性质5 :设 n n 的质因数分解为 m ∏ i = 1 p a i i ∏ i = 1 m p i a i ,那么 φ ( n ) = n m ∏ i = 1 ( 1 − 1 p i ) φ ( n ) = n ∏ i = 1 m ( 1 − 1 p i )
性质6 :∑ d | n φ ( d ) = n ∑ d | n φ ( d ) = n
证明:设 f ( n ) = ∑ d | n φ ( d ) f ( n ) = ∑ d | n φ ( d ) ,当 g c d ( x , y ) = 1 g c d ( x , y ) = 1 时:
f ( x ) f ( y ) = ∑ i | x φ ( i ) × ∑ j | y φ ( j ) = ∑ i | x ∑ j | y φ ( i ) φ ( j ) = ∑ i | x ∑ j | y φ ( i × j ) = ∑ d | x y φ ( d ) = f ( x y ) f ( x ) f ( y ) = ∑ i | x φ ( i ) × ∑ j | y φ ( j ) = ∑ i | x ∑ j | y φ ( i ) φ ( j ) = ∑ i | x ∑ j | y φ ( i × j ) = ∑ d | x y φ ( d ) = f ( x y )
所以 f f 是积性函数,那么设 n n 的质因数分解为 m ∏ i = 1 p a i i ∏ i = 1 m p i a i ,由 f f 是积性函数可得:
f ( n ) = m ∏ i = 1 f ( p a i i ) f ( n ) = ∏ i = 1 m f ( p i a i )
由性质2,可得 f ( p c ) = φ ( 1 ) + φ ( p ) + φ ( p 2 ) + ⋯ + φ ( p c ) = 1 + ( p − 1 ) + ( p 2 − p ) + ⋯ + ( p c − p c − 1 ) = p c f ( p c ) = φ ( 1 ) + φ ( p ) + φ ( p 2 ) + ⋯ + φ ( p c ) = 1 + ( p − 1 ) + ( p 2 − p ) + ⋯ + ( p c − p c − 1 ) = p c
所以 f ( n ) = ∏ m i = 1 f ( p a i i ) = ∏ m i = 1 p a i i = n f ( n ) = ∏ i = 1 m f ( p i a i ) = ∏ i = 1 m p i a i = n
原命题得证。
证毕。
0x12 莫比乌斯函数
莫比乌斯函数,符号为 μ μ ,定义如下:
⎧ ⎪
⎪
⎪
⎪ ⎨ ⎪
⎪
⎪
⎪ ⎩ 1 n = 1 ( − 1 ) m n = m ∏ i = 1 p a i i , a 1 ∼ n = 1 0 o t h e r w i s e { 1 n = 1 ( − 1 ) m n = ∏ i = 1 m p i a i , a 1 ∼ n = 1 0 o t h e r w i s e
性质1 :μ ( x ) μ ( y ) = μ ( x y ) ( gcd ( x , y ) = 1 ) μ ( x ) μ ( y ) = μ ( x y ) ( gcd ( x , y ) = 1 )
证明:如果 x = 1 x = 1 或 y = 1 y = 1 ,显然。
如果 μ ( x ) = 0 μ ( x ) = 0 或 μ ( y ) = 0 μ ( y ) = 0 ,显然。
否则 μ ( x ) μ ( y ) = ( − 1 ) m x ( − 1 ) m y = ( − 1 ) m x + m y = μ ( x y ) μ ( x ) μ ( y ) = ( − 1 ) m x ( − 1 ) m y = ( − 1 ) m x + m y = μ ( x y )
证毕。
性质2 :∑ d | n μ ( d ) = ϵ ( n ) ∑ d | n μ ( d ) = ϵ ( n )
证明:与欧拉函数的性质6证明类似。
0x20 筛法
本 part 记录了几种常见的筛法筛积性函数和素数的方法。
0x21 埃拉托斯特尼筛法(埃氏筛)
筛质数
考虑如果一个数 x x 是合数,那么 x x 的倍数也是合数,所以如果我们从小到大考虑每个数,然后同时把当前这个数的所有(比自己大的)倍数记为合数,那么运行结束的时候没有被标记的数就是素数了。
CI N = 2e5 ; bool Mx[N + 5 ];
void Eratosthenes (int n) {
RI i, j; Mx[1 ] = 1 ; for (i = 2 ; i <= n; ++ i) if (! Mx[i]) for (j = 2 ; i * j <= n; ++ j) Mx[i * j] = 1 ;
}
时间复杂度 O ( n log log n ) O ( n log log n )
0x22 线性筛(欧拉筛)
考虑到埃氏筛一个合数可能被筛多遍,如果省掉无意义的步骤,复杂度就降为 O ( n ) O ( n ) 了。
筛质数
CI N = 2e5 ; int P[N + 5 ], Nt; bool Mx[N + 5 ];
void Euler (int n) {
RI i, j; for (i = 2 ; i <= n; ++ i) for (! Mx[i] && (P[++ Nt] = i), j = 1 ; j <= Nt && i * P[j] <= n; ++ j) if (Mx[i * P[j]] = 1 , ! (i % P[j])) break ;
}
筛欧拉函数
根据欧拉函数的如下性质:
φ ( p ) = p − 1 ( p ∈ p r i m e ) φ ( p ) = p − 1 ( p ∈ p r i m e )
φ ( x × p ) = φ ( x ) × p ( p ∣ x ) φ ( x × p ) = φ ( x ) × p ( p ∣ x )
φ ( x × p ) = φ ( x ) × ( p − 1 ) ( gcd ( p , x ) = 1 ) φ ( x × p ) = φ ( x ) × ( p − 1 ) ( gcd ( p , x ) = 1 )
可以在筛质数的同时筛出欧拉函数。
CI N = 1e5 ; int P[N + 5 ], Pt, phi[N + 5 ], n; bool Mx[N + 5 ];
void C (int d)
{
RI i, j; phi[1 ] = 1 ; for (i = 2 ; i <= d; ++ i) for (! Mx[i] && (P[++ Pt] = i, phi[i] = i - 1 ), j = 1 ; j <= Pt && i * P[j] <= d; ++ j) {
if (Mx[i * P[j]] = 1 , ! (i % P[j]) && (phi[P[j] * i] = phi[i] * P[j], 1 )) break ;
else phi[i * P[j]] = phi[i] * (P[j] - 1 );
}
}
筛莫比乌斯函数
CI N = 1e5 ; int P[N + 5 ], Pt, mu[N + 5 ], n; bool Mx[N + 5 ];
void C (int d)
{
RI i, j; mu[1 ] = -1 ; for (i = 2 ; i <= d; ++ i) for (! Mx[i] && (P[++ Pt] = i, mu[i] = -1 ), j = 1 ; j <= Pt && i * P[j] <= d; ++ j) {
if (Mx[i * P[j]] = 1 , ! (i % P[j]) && (mu[P[j] * i] = 0 , 1 )) break ;
else mu[i * P[j]] = -mu[i];
}
}
0x30 例题
思路
显然,如果一个坐标 ( x , y ) ( x , y ) ,gcd ( x , y ) ≠ 1 gcd ( x , y ) ≠ 1 ,那么这个点一定会被 ( x gcd ( x , y ) , y gcd ( x , y ) ) ( x gcd ( x , y ) , y gcd ( x , y ) ) 这个点挡住。那么,这个式子就很显然了:
n ∑ x = 1 n ∑ y = 1 [ gcd ( x , y ) = 1 ] ∑ x = 1 n ∑ y = 1 n [ gcd ( x , y ) = 1 ]
这个式子可以拆成三部分:
n ∑ x = 1 x − 1 ∑ y = 1 [ gcd ( x , y ) = 1 ] + n ∑ x = 1 x ∑ y = x [ gcd ( x , y ) = 1 ] + n ∑ x = 1 n ∑ y = x + 1 [ gcd ( x , y ) = 1 ] ∑ x = 1 n ∑ y = 1 x − 1 [ gcd ( x , y ) = 1 ] + ∑ x = 1 n ∑ y = x x [ gcd ( x , y ) = 1 ] + ∑ x = 1 n ∑ y = x + 1 n [ gcd ( x , y ) = 1 ]
其中因为对于所有 ( x , x ) ( x , x ) 的点,都会被 ( 2 , 2 ) ( 2 , 2 ) 挡住,所以中间这部分为 1 1 。由图像可知,式子前后两部分是对称的,所以这个式子可以化简为:
2 n ∑ x = 1 x − 1 ∑ y = 1 [ gcd ( x , y ) = 1 ] + 1 2 ∑ x = 1 n ∑ y = 1 x − 1 [ gcd ( x , y ) = 1 ] + 1
而 ∑ x − 1 y = 1 [ gcd ( x , y ) = 1 ] ∑ y = 1 x − 1 [ gcd ( x , y ) = 1 ] 这部分刚好是 φ φ 的定义,所以最终式子为:
2 n ∑ x = 1 φ ( x ) + 1 2 ∑ x = 1 n φ ( x ) + 1
可以先线性筛筛出 1 ∼ n 1 ∼ n 的欧拉函数,然后 O ( n ) O ( n ) 统计答案。
n ∑ i = 1 n ∑ j = 1 gcd ( i , j ) ( 0 ) ∑ i = 1 n ∑ j = 1 n gcd ( i , j ) ( 0 )
通过欧拉函数的性质,可以将这个式子化简为:
( 0 ) = n ∑ i = 1 n ∑ j = 1 ∑ d | g c d ( i , j ) φ ( d ) = n ∑ i = 1 n ∑ j = 1 ∑ d | i , d | j φ ( d ) = n ∑ i = 1 n ∑ j = 1 n ∑ d = 1 φ ( d ) [ d | i ] [ d | j ] = n ∑ d = 1 φ ( d ) n ∑ i = 1 n ∑ j = 1 [ d | i ] [ d | j ] = n ∑ d = 1 φ ( d ) ⌊ n d ⌋ 2 ( 0 ) = ∑ i = 1 n ∑ j = 1 n ∑ d | g c d ( i , j ) φ ( d ) = ∑ i = 1 n ∑ j = 1 n ∑ d | i , d | j φ ( d ) = ∑ i = 1 n ∑ j = 1 n ∑ d = 1 n φ ( d ) [ d | i ] [ d | j ] = ∑ d = 1 n φ ( d ) ∑ i = 1 n ∑ j = 1 n [ d | i ] [ d | j ] = ∑ d = 1 n φ ( d ) ⌊ n d ⌋ 2
这样就可以 O ( n ) O ( n ) 解决问题了,可以再套一个整除分块,但是 n ≤ 10 5 n ≤ 10 5 ,所以没必要。
假设 b ≥ a b ≥ a ,那么题目显然让我们求
a ∑ i = 1 b ∑ j = 1 [ gcd ( i , j ) = x ] ∑ i = 1 a ∑ j = 1 b [ gcd ( i , j ) = x ]
将 x x 除掉,得:
⌊ a x ⌋ ∑ i = 1 ⌊ b x ⌋ ∑ j = 1 [ gcd ( i , j ) = 1 ] ∑ i = 1 ⌊ a x ⌋ ∑ j = 1 ⌊ b x ⌋ [ gcd ( i , j ) = 1 ]
根据莫比乌斯函数的性质,得:
⌊ a x ⌋ ∑ i = 1 ⌊ b x ⌋ ∑ j = 1 ∑ d | gcd ( i , j ) μ ( d ) ∑ i = 1 ⌊ a x ⌋ ∑ j = 1 ⌊ b x ⌋ ∑ d | gcd ( i , j ) μ ( d )
将 d d 改为枚举 d d 的形式,得:
⌊ a x ⌋ ∑ i = 1 ⌊ b x ⌋ ∑ j = 1 ⌊ a x ⌋ ∑ d = 1 μ ( d ) [ d | gcd ( i , j ) ] ∑ i = 1 ⌊ a x ⌋ ∑ j = 1 ⌊ b x ⌋ ∑ d = 1 ⌊ a x ⌋ μ ( d ) [ d | gcd ( i , j ) ]
发现 ⌊ a x ⌋ ∑ d = 1 μ ( d ) ∑ d = 1 ⌊ a x ⌋ μ ( d ) 可以提到前面去,得:
⌊ a x ⌋ ∑ d = 1 μ ( d ) ⌊ a x ⌋ ∑ i = 1 ⌊ b x ⌋ ∑ j = 1 [ d | gcd ( i , j ) ] ∑ d = 1 ⌊ a x ⌋ μ ( d ) ∑ i = 1 ⌊ a x ⌋ ∑ j = 1 ⌊ b x ⌋ [ d | gcd ( i , j ) ]
如果 [ d | gcd ( i , j ) ] = 1 [ d | gcd ( i , j ) ] = 1 ,那么 i , j i , j 都要是 d d 的倍数,于是得:
⌊ a x ⌋ ∑ d = 1 μ ( d ) ⌊ a x d ⌋ ⌊ b x d ⌋ ∑ d = 1 ⌊ a x ⌋ μ ( d ) ⌊ a x d ⌋ ⌊ b x d ⌋
由于有多组数据,所以套一个整除分块,复杂度 O ( T √ n ) O ( T n ) ,其中 T T 为数据组数,n n 为 min ( a , b ) min ( a , b ) 。
0xF0 附件
0xF1 算式中出现的符号及其含义
符号
含义
例子
x ∣ y , x ∤ y x ∣ y , x ∤ y
前者为 y y 整除 x x ,即 x x 是 y y 的因数;后者与前者相反
1 ∣ 2 , 2 ∣ 6 , 4 ∣ 20 , 3 ∤ 4 , 4 ∤ 9 1 ∣ 2 , 2 ∣ 6 , 4 ∣ 20 , 3 ∤ 4 , 4 ∤ 9
gcd ( x , y ) gcd ( x , y )
x x 和 y y 的最大公因数
gcd ( 2 , 4 ) = 2 , gcd ( 3 , 7 ) = 1 gcd ( 2 , 4 ) = 2 , gcd ( 3 , 7 ) = 1
∑ ∑
求和,具体见例子
n ∑ i = 1 a i = a 1 + a 2 + ⋯ + a n , ∑ d ∣ n d = n 的 所 有 因 数 相 加 ∑ i = 1 n a i = a 1 + a 2 + ⋯ + a n , ∑ d ∣ n d = n 的 所 有 因 数 相 加
∏ ∏
求积,具体见例子
n ∏ i = 1 a i = a 1 × a 2 × ⋯ × a n ∏ i = 1 n a i = a 1 × a 2 × ⋯ × a n
∀ ∀
所有满足某条件的数
∀ x ∣ y ∀ x ∣ y 指 x x 的取值范围为 y y 的因数,或 y y 的因数集合
[ A ] [ A ]
如果 A A 为 false,那么 [ A ] = 0 [ A ] = 0 ;如果 A A 为 true,那么 [ A ] = 1 [ A ] = 1
[ 2 ∣ 3 ] = 0 , [ gcd ( 2 , 4 ) = 2 ] = 1 , [ 1 = 0 ] = 0 [ 2 ∣ 3 ] = 0 , [ gcd ( 2 , 4 ) = 2 ] = 1 , [ 1 = 0 ] = 0
⌊ x ⌋ ⌊ x ⌋
向下取整
⌊ 1.2 ⌋ = 1 , ⌊ 4.9 ⌋ = 4 , ⌊ 5 ⌋ = 5 ⌊ 1.2 ⌋ = 1 , ⌊ 4.9 ⌋ = 4 , ⌊ 5 ⌋ = 5
0xF2 描述中出现的专有名词或字母含义
数论函数: 指在整数集中定义的函数。
积性函数:如果数论函数 f f ,对于满足 gcd ( x , y ) = 1 gcd ( x , y ) = 1 的 ∀ x , y ∀ x , y ,f ( x ) f ( y ) = f ( x y ) f ( x ) f ( y ) = f ( x y ) ,那么 f f 就是一个积性函数。
Z Z :指整数集,Z + Z + 指正整数集。
ϵ ϵ :单位函数,定义为 ϵ ( 1 ) = 1 , ϵ ( n ) = 0 ( n ≥ 2 ) ϵ ( 1 ) = 1 , ϵ ( n ) = 0 ( n ≥ 2 ) 。
I d I d :单位函数,定义为 I d ( n ) = n I d ( n ) = n 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)