前置知识:狄利克雷卷积、线性筛
积性函数的定义若数论函数
f
f
f满足
∀
a
⊥
b
,
f
(
a
)
⋅
f
(
b
)
=
f
(
a
b
)
\forall a\perp b,f(a)\cdot f(b)=f(ab)
∀a⊥b,f(a)⋅f(b)=f(ab),则
f
f
f是一个积性函数
完全积性函数:若数论函数
f
f
f满足
∀
a
,
b
∈
Z
+
,
f
(
a
)
⋅
f
(
b
)
=
f
(
a
b
)
\forall a,b\in Z_+,f(a)\cdot f(b)=f(ab)
∀a,b∈Z+,f(a)⋅f(b)=f(ab),则
f
f
f是一个完全积性函数
常见的积性函数有欧拉函数
ϕ
\phi
ϕ,莫比乌斯函数
μ
\mu
μ,约数和
σ
0
\sigma_0
σ0等
积性函数的一个性质:若
f
,
g
f,g
f,g都是积性函数,则
f
f
f和
g
g
g的狄利克雷卷积
f
∗
g
f*g
f∗g也为积性函数
证明:
记
h
=
f
∗
g
h=f*g
h=f∗g
对于任意的
a
⊥
b
a\perp b
a⊥b,有:
h
(
a
b
)
=
(
f
∗
g
)
(
a
b
)
h(ab)=(f*g)(ab)
h(ab)=(f∗g)(ab)
=
∑
d
∣
a
b
f
(
d
)
g
(
a
b
d
)
=\sum_{d|ab}f(d)g(\frac{ab}{d})
=∑d∣abf(d)g(dab)
=
∑
d
∣
a
,
k
∣
b
f
(
d
k
)
g
(
a
b
d
k
)
=\sum_{d|a,k|b}f(dk)g(\frac{ab}{dk})
=∑d∣a,k∣bf(dk)g(dkab)
=
∑
d
∣
a
,
k
∣
b
f
(
d
)
f
(
k
)
g
(
a
d
)
g
(
b
k
)
=\sum_{d|a,k|b}f(d)f(k)g(\frac{a}{d})g(\frac{b}{k})
=∑d∣a,k∣bf(d)f(k)g(da)g(kb)
=
∑
d
∣
a
f
(
d
)
g
(
a
d
)
∑
k
∣
b
f
(
k
)
g
(
b
k
)
=\sum_{d|a}f(d)g(\frac{a}{d})\sum_{k|b}f(k)g(\frac{b}{k})
=∑d∣af(d)g(da)∑k∣bf(k)g(kb)
=
h
(
a
)
h
(
b
)
=h(a)h(b)
=h(a)h(b)
事实上很多积性函数都可以线性筛求解:
如果一个积性函数
f
f
f,我们可以快速求出
f
(
1
)
,
f
(
p
)
f(1),f(p)
f(1),f(p)和
f
(
p
k
)
f(p^k)
f(pk),就可以进行线性筛。
方法:
我们需要辅助数组
l
o
w
low
low
记
n
n
n的一个素因子为
p
p
p,次数为
α
\alpha
α
l
o
w
[
n
]
low[n]
low[n]即为
p
α
p^\alpha
pα
当
n
=
l
o
w
[
n
]
n=low[n]
n=low[n]时,
f
(
n
)
=
f
(
p
α
)
f(n)=f(p^\alpha)
f(n)=f(pα),直接计算就好了
当
n
≠
l
o
w
[
n
]
n\not=low[n]
n=low[n]时,
f
(
n
)
=
f
(
n
l
o
w
[
n
]
)
f
(
l
o
w
[
n
]
)
f(n)=f(\frac{n}{low[n]})f(low[n])
f(n)=f(low[n]n)f(low[n])
然后再处理一些细节就好了
代码:
void init(){
f[1]=f在1的值;
for(int i=2;i<N;i++){
if(!vis[i]){
prm[tot++]=i;
low[i]=i;
f[i]=f在p的值;
}
for(int j=0,p=prm[j],k=p*i;j<tot&&k<N;j++,p=prm[j],k=p*i){
vis[k]=1;
if(!(i%prm[j])){
low[k]=low[i]*p;
if(i==low[i])
f[k]=f在p^α的值;
else f[k]=f[i/low[i]]*f[low[k]];
break;
}
f[k]=f[i]*f[low[k]=p];
}
}
return;
}
有一些特殊数论函数的线性筛不需要 l o w low low数组,在后续会讲到。