打表五个积性函数(欧拉函数、莫比乌斯函数、因数个数函数、因数个数和函数、某自定义函数
学校专题题目
由于线性筛几乎可以筛所有积性函数(并且本题中的五个积性函数均可以被线性筛),所以我们考虑一次同时筛这五个积性函数。以下考虑每种积性函数各自的筛法。
1、欧拉函数: ϕ ( x ) \phi (x) ϕ(x)
(1)当 x x x 为质数时,显然,小于 x x x 的数均与 x x x 互质,所以此时欧拉函数的值即为 x − 1 x - 1 x−1。
(2)当 ( i % p r i m e [ j ] = = 0 ) (i\ \% \ prime[j] == 0) (i % prime[j]==0) 时, ϕ ( i ∗ p r i m e [ j ] ) = ϕ ( i ) ∗ p r i m e [ j ] \phi (i * prime[j]) = \phi(i) * prime[j] ϕ(i∗prime[j])=ϕ(i)∗prime[j]。
由第一种情况,我们知道 $\phi (n) = n · \prod_{i = 1}^{s} \frac {p_i - 1}{p_i} $(把 n n n 质因数分解,分别带入各个乘式中,结合第一种情况,且欧拉函数是积性函数,即可证明)。
所以有:
ϕ
(
n
∗
p
r
i
m
e
[
j
]
)
=
(
n
∗
p
r
i
m
e
[
j
]
)
∗
∏
i
=
1
s
p
i
−
1
p
i
=
i
∗
∏
i
=
1
s
p
i
−
1
p
i
∗
p
r
i
m
e
[
j
]
=
ϕ
(
n
)
∗
p
r
i
m
e
[
j
]
\phi (n * prime[j]) = (n * prime[j]) * \prod _{i = 1}^{s}\frac {p_i - 1}{p_i} \\= i * \prod _{i = 1}^{s}\frac{p_i - 1}{p_i} * prime[j] = \phi (n) * prime[j]
ϕ(n∗prime[j])=(n∗prime[j])∗i=1∏spipi−1=i∗i=1∏spipi−1∗prime[j]=ϕ(n)∗prime[j]
(3)当
(
i
%
p
r
i
m
e
[
j
]
!
=
0
)
(i\ \%\ prime[j] != 0)
(i % prime[j]!=0) 时,由积性函数性质,可以直接得出:
ϕ
(
i
∗
p
r
i
m
e
[
j
]
)
=
ϕ
(
i
)
∗
ϕ
(
p
r
i
m
e
[
j
]
)
\phi (i * prime[j]) = \phi (i)* \phi (prime[j])
ϕ(i∗prime[j])=ϕ(i)∗ϕ(prime[j])
2、莫比乌斯函数 : μ ( x ) \mu (x) μ(x)
(1)当 x x x 为质数时,根据莫比乌斯函数定义,显然此时莫比乌斯函数的值为 − 1 - 1 −1。
(2)当 $(i\ % \ prime[j] == 0) $ 时, μ ( i ∗ p r i m e [ j ] ) = 0 \mu (i * prime[j]) = 0 μ(i∗prime[j])=0。
因为莫比乌斯函数在质因数分解后只要某个质因子的个数超过 1 1 1 个,那么根据定义,莫比乌斯函数的值即为 0 0 0。
(3)当
(
i
%
p
r
i
m
e
[
j
]
!
=
0
)
(i\ \%\ prime[j] != 0)
(i % prime[j]!=0) 时,由积性函数性质,可以直接得出:
μ
(
i
∗
p
r
i
m
e
[
j
]
)
=
μ
(
i
)
∗
μ
(
p
r
i
m
e
[
j
]
)
=
−
μ
(
i
)
\mu (i * prime[j]) = \mu (i) * \mu (prime[j]) = -\mu (i)
μ(i∗prime[j])=μ(i)∗μ(prime[j])=−μ(i)
3、因数个数函数: σ 0 ( x ) \sigma_0 (x) σ0(x)
筛因数个数函数时,我们需要一个辅助数组 n u m [ i ] num[i] num[i],表示数字 i i i 的最小质因子的个数。
为什么要用这个数组?先给出三种情况的结论,然后再解释。
(1)当 x x x 为质数时,显然, x x x 的因数只有两个,所以此时因数个数函数的值即为 2 2 2。
(2)当 ( i % p r i m e [ j ] = = 0 ) (i\ \% \ prime[j] == 0) (i % prime[j]==0) 时, σ 0 ( i ∗ p r i m e [ j ] ) = σ 0 ( i ) / ( n u m [ i ] + 1 ) ∗ ( n u m [ i ] + 2 ) \sigma_0 (i * prime[j]) = \sigma_0 (i) /(num[i] + 1) * (num[i] + 2) σ0(i∗prime[j])=σ0(i)/(num[i]+1)∗(num[i]+2)。
n u m [ i ∗ p r i m e [ j ] ] = n u m [ i ] + 1 num[i * prime[j]] = num[i] + 1 num[i∗prime[j]]=num[i]+1。
(3)当
(
i
%
p
r
i
m
e
[
j
]
!
=
0
)
(i\ \%\ prime[j] != 0)
(i % prime[j]!=0) 时,由积性函数性质,可以直接得出:
σ
0
(
i
∗
p
r
i
m
e
[
j
]
)
=
σ
0
(
i
)
∗
σ
0
(
p
r
i
m
e
[
j
]
)
\sigma _0 (i * prime[j]) = \sigma_0 (i) * \sigma_0 (prime[j])
σ0(i∗prime[j])=σ0(i)∗σ0(prime[j])
同时,我们还可以得到
n
u
m
[
i
∗
p
r
i
m
e
[
j
]
]
=
1
num[i * prime[j]] = 1
num[i∗prime[j]]=1 (因为
i
i
i 和
p
r
i
m
e
[
j
]
prime[j]
prime[j] 互质,所以二者相乘后最小质因数的个数为1)
对 n u m [ i ] num[i] num[i] 数组的解释:我们发现, n u m [ i ] num[i] num[i] 仅在 ( i % p r i m e [ j ] = = 0 ) (i\ \% \ prime[j] == 0) (i % prime[j]==0) 时对答案产生贡献。原因是,我们考虑 n = ∏ i = 1 s p i a i n = \prod _{i = 1} ^ {s} {p_i ^{a_i}} n=∏i=1spiai,那么 σ 0 ( n ) = ∏ i = 1 s ( 1 + a i ) \sigma_0 (n) = \prod _{i = 1} ^{s}(1 + a_i) σ0(n)=∏i=1s(1+ai),因为对于每个质因子,我们可以不选,可以选 1 1 1 个,选 2 2 2 个… 选 a i a_i ai 个,一共是 ( 1 + a i ) (1 + a_i) (1+ai) 种选择,根据乘法原理即可得出这个算式。
考虑 ( i % p r i m e [ j ] ! = 0 ) (i\ \% \ prime[j] != 0) (i % prime[j]!=0),也就是说 p r i m e [ j ] prime[j] prime[j] 是 i i i 的一个(最小)质因子。那么 σ 0 ( i ∗ p i r m e [ j ] ) = ( ∏ i = 1 s ( 1 + a i ) ) / ( 1 + a 1 ) ∗ ( 1 + a 1 + 1 ) = σ 0 ( i ) / ( 1 + a 1 ) ∗ ( 1 + a 1 + 1 ) \sigma _0 (i * pirme[j]) = (\prod _{i = 1}^{s} (1 + a_i)) / (1 + a_1) * (1 + a_1 + 1) = \sigma_0 (i) / (1 + a_1) * (1 + a_1 + 1) σ0(i∗pirme[j])=(∏i=1s(1+ai))/(1+a1)∗(1+a1+1)=σ0(i)/(1+a1)∗(1+a1+1),(因为最小的质因子个数加了一个,所以除以原来的个数再乘以原来的个数加 1 1 1)
这里我们用
n
u
m
[
i
]
num[i]
num[i] 代表上式中的
(
1
+
a
1
)
(1 + a_1)
(1+a1),就得到了:
σ
0
(
i
∗
p
r
i
m
e
[
j
]
)
=
σ
0
(
i
)
/
(
n
u
m
[
i
]
+
1
)
∗
(
n
u
m
[
i
]
+
2
)
\sigma_0 (i * prime[j]) = \sigma_0 (i) /(num[i] + 1) * (num[i] + 2)
σ0(i∗prime[j])=σ0(i)/(num[i]+1)∗(num[i]+2)
4、因数和函数: σ 1 ( x ) \sigma _1 (x) σ1(x)
筛因数和函数时我们也需要一个辅助数组 s p [ x ] sp[x] sp[x]。对于数 x x x,若其最小质因子为 p p p,且个数为 a a a,
那么 s p [ x ] = ( 1 + p + p 2 + . . . + p a ) sp[x] = (1 + p + p^{2} + ... + p^{a}) sp[x]=(1+p+p2+...+pa)。
同样先给出三种情况的结论再做解释。
(1)当 x 为质数时,显然, x x x 的因数只有 1 1 1 和 x x x,所以此时因数和函数的值即为 1 + x 1 + x 1+x。
(2)当 ( i % p r i m e [ j ] = = 0 ) (i\ \% \ prime[j] == 0) (i % prime[j]==0) 时, σ 1 ( i ∗ p r i m e [ j ] ) = σ 1 / s p [ i ] ∗ ( s p [ i ] ∗ p r i m e [ j ] + 1 ) \sigma_1 (i * prime[j]) = \sigma_1 / sp[i] * (sp[i] * prime[j] + 1) σ1(i∗prime[j])=σ1/sp[i]∗(sp[i]∗prime[j]+1)。
s p [ i ∗ p r i m e [ j ] ] = s p [ i ] ∗ p r i m e [ j ] + 1 sp[i * prime[j]] = sp[i] * prime[j] + 1 sp[i∗prime[j]]=sp[i]∗prime[j]+1
(3)当
(
i
%
p
r
i
m
e
[
j
]
!
=
0
)
(i\ \%\ prime[j] != 0)
(i % prime[j]!=0) 时,由积性函数性质,可以直接得出:
σ
1
(
i
∗
p
r
i
m
e
[
j
]
)
=
σ
1
(
i
)
∗
σ
1
(
p
r
i
m
e
[
j
]
)
\sigma _1 (i * prime[j]) = \sigma _1 (i) * \sigma _1 (prime[j])
σ1(i∗prime[j])=σ1(i)∗σ1(prime[j])
同时,我们还可以得到
s
p
[
i
∗
p
r
i
m
e
[
j
]
]
=
1
+
p
r
i
m
e
[
j
]
sp[i * prime[j]] = 1 + prime[j]
sp[i∗prime[j]]=1+prime[j],因为
i
i
i 和
p
r
i
m
e
[
j
]
prime[j]
prime[j] 互质,所以二者相乘后最小质因数的几何级数序列就为
(
1
,
p
r
i
m
e
[
j
]
1
)
(1, prime[j] ^ 1)
(1,prime[j]1),和即为
(
1
+
p
r
i
m
e
[
j
]
)
(1 + prime[j])
(1+prime[j])。
对 s p [ x ] sp[x] sp[x] 数组的解释:计算某个数字 N N N 的约数和时,有一个定理:
σ 1 ( N ) = ( 1 + p 1 + p 1 2 + . . . + p 1 a 1 ) ( 1 + p 2 + p 2 2 + . . . + p 2 a 2 ) . . . ( 1 + p m + p m 2 + . . . + p m a m ) \sigma_1 (N) = (1 + p_1 + p_1 ^2 + ... + p_1^{a_1})(1 + p_2 + p_2 ^2 + ... + p_2^{a_2})...(1 + p_m + p_m ^2 + ... + p_m^{a_m}) σ1(N)=(1+p1+p12+...+p1a1)(1+p2+p22+...+p2a2)...(1+pm+pm2+...+pmam),其中 p i p_i pi 指的是 N N N 的某个质因子, a i a_i ai 指的是质因子 p i p_i pi 的个数。
有了这个定理,不难发现,当
p
r
i
m
e
[
j
]
prime[j]
prime[j] 为
i
i
i 的最小质因子时,
σ
1
(
i
∗
p
r
i
m
e
[
j
]
)
=
σ
1
(
i
)
/
(
1
+
p
1
+
p
1
2
+
.
.
.
+
p
1
a
i
)
∗
(
1
+
p
1
+
p
1
2
+
.
.
.
+
p
1
a
i
+
p
1
a
i
+
1
)
\sigma _1(i * prime[j])= \sigma _1(i) / (1 + p_1 + p_1 ^2 +...+ p_1^{a_i}) * (1 + p_1 + p_1^2 +...+ p_1^{a_i} + p_1^{a_i+1})
σ1(i∗prime[j])=σ1(i)/(1+p1+p12+...+p1ai)∗(1+p1+p12+...+p1ai+p1ai+1)
把
s
p
[
i
]
sp[i]
sp[i] 数组带入上式可得:
σ
1
(
i
∗
p
r
i
m
e
[
j
]
)
=
σ
1
/
s
p
[
i
]
∗
(
s
p
[
i
]
∗
p
r
i
m
e
[
j
]
+
1
)
\sigma_1 (i * prime[j]) = \sigma_1 / sp[i] * (sp[i] * prime[j] + 1)
σ1(i∗prime[j])=σ1/sp[i]∗(sp[i]∗prime[j]+1)
同时我们可以得到,
s
p
[
i
∗
p
r
i
m
e
[
j
]
]
=
s
p
[
i
]
∗
p
r
i
m
e
[
j
]
+
1
sp[i * prime[j]] = sp[i] * prime[j] + 1
sp[i∗prime[j]]=sp[i]∗prime[j]+1,因为
p
r
i
m
e
[
j
]
prime[j]
prime[j] 是
i
i
i 的最小质因子,所以
i
∗
p
r
i
m
e
[
j
]
i * prime[j]
i∗prime[j] 的最小质因子个数比
i
i
i 多一个,结合
s
p
[
i
]
sp[i]
sp[i] 的定义即可计算出。
5、自定义函数 f ( x ) = ( μ ⋅ ϕ ) ∗ σ 1 f(x) = (\mu · \phi) * \sigma_1 f(x)=(μ⋅ϕ)∗σ1
由于 μ ( x ) , ϕ ( x ) \mu (x), \phi (x) μ(x),ϕ(x) 均为积性函数,所以 ( μ ⋅ ϕ ) ( x ) (\mu · \phi)(x) (μ⋅ϕ)(x) 也是积性函数;又 σ 1 \sigma_1 σ1 也是积性函数,所以 f ( x ) f(x) f(x) 也是积性函数。
利用卷积定义,首先对这个函数化简得到:
f
(
x
)
=
∑
d
∣
x
μ
(
d
)
ϕ
(
d
)
σ
1
(
x
d
)
f(x) = \sum_{d|x}\mu (d)\phi (d)\sigma_1(\frac{x}{d})
f(x)=d∣x∑μ(d)ϕ(d)σ1(dx)
用类似的方法考虑三种情况下
f
(
x
)
f(x)
f(x) 的大小。
(1)当
x
x
x 为质数时。
d
d
d 的取值仅有
1
1
1 和
x
x
x,所以有:
f
(
x
)
=
μ
(
1
)
ϕ
(
1
)
σ
1
(
x
)
+
μ
(
x
)
ϕ
(
x
)
σ
1
(
1
)
=
σ
1
(
x
)
−
x
+
1
f(x) = \mu (1)\phi (1)\sigma_1 (x) + \mu(x)\phi(x)\sigma_1 (1) = \sigma_1 (x) - x + 1
f(x)=μ(1)ϕ(1)σ1(x)+μ(x)ϕ(x)σ1(1)=σ1(x)−x+1
(2)当
(
i
%
p
r
i
m
e
[
j
]
=
=
0
)
(i\ \% \ prime[j] == 0)
(i % prime[j]==0)时,
p
r
i
m
e
[
j
]
prime[j]
prime[j] 为
i
i
i 的最小质因子。
假设 i = p 1 a 1 ∏ k = 2 s p k a k i = p_1^{a_1}\prod _{k = 2}^{s} p_k^{a_k} i=p1a1∏k=2spkak,那么 i ∗ p r i m e [ j ] = p 1 a i + 1 ∏ k = 2 s p k a k i * prime[j] = p_1^{a_i + 1}\prod _{k = 2}^{s}p_k^{a_k} i∗prime[j]=p1ai+1∏k=2spkak,
由积性函数的性质,有:
f
(
i
∗
p
r
i
m
e
[
j
]
)
=
f
(
p
1
a
i
+
1
)
∗
f
(
∏
k
=
2
s
p
k
a
k
)
f(i * prime[j]) = f(p_1^{a_i + 1}) *f(\prod_{k = 2}^{s}p_k^{a_k})
f(i∗prime[j])=f(p1ai+1)∗f(k=2∏spkak)
所以,计算
f
(
i
∗
p
r
i
m
e
[
j
]
)
f(i * prime[j])
f(i∗prime[j]) 时,只需要统计出
i
∗
p
r
i
m
e
[
j
]
i * prime[j]
i∗prime[j] 中有多少个质因子
p
r
i
m
e
[
j
]
prime[j]
prime[j],把
i
∗
p
r
i
m
e
[
j
]
i * prime[j]
i∗prime[j] 拆成
p
1
a
i
+
1
p_1^{a_i + 1}
p1ai+1 和
∏
k
=
2
s
(
p
k
a
k
)
\prod_{k = 2}^s(p_k^{a_k})
∏k=2s(pkak),利用上式就可以求出答案了。
(3)当
(
i
%
p
r
i
m
e
[
j
]
!
=
0
)
(i\ \% \ prime[j] != 0)
(i % prime[j]!=0)时,由积性函数性质,可以直接得出:
f
(
i
∗
p
r
i
m
e
[
j
]
)
=
f
(
i
)
∗
f
(
p
r
i
m
e
[
j
]
)
f(i * prime[j]) = f(i) * f(prime[j])
f(i∗prime[j])=f(i)∗f(prime[j])