莫比乌斯反演
我们知道积性函数可以迪雷克卷积
我们知道F(x)=Σd|xf(d)
要求f(x)
两面卷上一个μ
得
F
∗
μ
=
f
∗
1
∗
μ
F*μ=f*1*μ
F∗μ=f∗1∗μ
得
F
∗
μ
=
f
∗
(
1
∗
μ
)
F*μ=f*(1*μ)
F∗μ=f∗(1∗μ)
得
F
∗
μ
=
f
∗
e
F*μ=f*e
F∗μ=f∗e
得
F
∗
μ
=
f
F*μ=f
F∗μ=f
也就是
f
=
Σ
d
∣
x
μ
(
x
/
d
)
f
(
d
)
f=Σd|x μ(x/d)f(d)
f=Σd∣xμ(x/d)f(d)
其实就是应为简单的迪雷克卷积
而我们用的最多的就是
e
(
x
)
=
[
x
=
=
1
]
e(x)=[x==1]
e(x)=[x==1]了
也就是
Σ
d
∣
x
μ
(
x
/
d
)
Σd|x μ(x/d)
Σd∣xμ(x/d)这个东西
杜教筛
我们需要求f(x)的前缀和F(x)
然而 n 有时达到 100000000
O(n) 就不可做了
我们需要一个O(n^3/4)的做法—杜教筛
我们找一个函数g(x)与f(x)的迪雷克卷积的前缀和很好求
则
f
∗
g
(
n
)
=
Σ
d
∣
n
f
(
d
)
∗
g
(
n
/
d
)
f*g(n)=Σd|n f(d)*g(n/d)
f∗g(n)=Σd∣nf(d)∗g(n/d)
然后
Σ
i
=
1
n
f
∗
g
(
i
)
=
Σ
i
=
1
n
Σ
d
∣
i
f
(
i
/
d
)
∗
g
(
d
)
Σi=1~n f*g(i)=Σi=1~n Σd|i f(i/d)*g(d)
Σi=1 nf∗g(i)=Σi=1 nΣd∣if(i/d)∗g(d)
然后先枚举d
Σ
i
=
1
n
f
∗
g
(
i
)
=
Σ
d
=
1
n
g
(
d
)
∗
Σ
d
∣
i
f
(
i
/
d
)
Σi=1~n f*g(i)=Σd=1~n g(d)* Σd|i f(i/d)
Σi=1 nf∗g(i)=Σd=1 ng(d)∗Σd∣if(i/d)
然后
Σ
i
=
1
n
f
∗
g
(
i
)
=
Σ
d
=
1
n
g
(
d
)
∗
Σ
i
=
1
n
/
d
f
(
i
)
Σi=1~n f*g(i)=Σd=1~n g(d)* Σi=1~n/d f(i)
Σi=1 nf∗g(i)=Σd=1 ng(d)∗Σi=1 n/df(i)
然后
Σ
i
=
1
n
f
∗
g
(
i
)
=
Σ
d
=
1
n
g
(
d
)
∗
F
(
n
/
d
)
Σi=1~n f*g(i)=Σd=1~n g(d)* F(n/d)
Σi=1 nf∗g(i)=Σd=1 ng(d)∗F(n/d)
得
Σ
i
=
1
n
f
∗
g
(
i
)
=
g
(
1
)
∗
F
(
n
)
+
Σ
d
=
2
n
g
(
d
)
∗
F
(
n
/
d
)
Σi=1~n f*g(i)=g(1)*F(n)+Σd=2~n g(d)* F(n/d)
Σi=1 nf∗g(i)=g(1)∗F(n)+Σd=2 ng(d)∗F(n/d)
移项,得
g
(
1
)
∗
F
(
n
)
=
Σ
i
=
1
n
f
∗
g
(
i
)
−
Σ
d
=
2
n
g
(
d
)
∗
F
(
n
/
d
)
g(1)*F(n)=Σi=1~n f*g(i)-Σd=2~n g(d)* F(n/d)
g(1)∗F(n)=Σi=1 nf∗g(i)−Σd=2 ng(d)∗F(n/d)
然后(n/d)这个东西就可以除法分块了