也许你已经学习了莫比乌斯反演,但看到式子还是不会化对不对。
但是你不用管它,就当你没学过,先记住两个式子:
等式一
[
n
=
1
]
=
∑
d
∣
n
μ
d
[n=1]=\sum_{d|n}\mu_d
[n=1]=∑d∣nμd
等式二
n
=
∑
d
∣
n
φ
d
n=\sum_{d|n}\varphi_d
n=∑d∣nφd
那么容易发现这两个等式的意义,等式一可以把一个“判一”的式子化成可以计算的函数,等式二把一个数化到枚举范围里面去。
这么说不是很清楚,但一般来说我们都用以下的形式:
等式一变式
[
gcd
(
a
,
b
)
=
1
]
=
∑
d
∣
gcd
(
a
,
b
)
μ
d
[\gcd(a,b)=1]=\sum_{d|\gcd(a,b)}\mu_d
[gcd(a,b)=1]=∑d∣gcd(a,b)μd
等式二变式
gcd
(
a
,
b
)
=
∑
d
∣
gcd
(
a
,
b
)
φ
d
\gcd(a,b)=\sum_{d|\gcd(a,b)}\varphi_d
gcd(a,b)=∑d∣gcd(a,b)φd
这两个式子是你首先要记住的。我们来看一道例题,这之后你可以学会DDZ重排,之后更多的内容就易如反掌了。以下的新内容都是DDZ重排。
【例题】求
∑
i
=
1
n
gcd
(
i
,
n
)
\sum_{i=1}^n\gcd(i,n)
i=1∑ngcd(i,n)
根据等式二变形,原式
=
∑
i
=
1
n
∑
d
∣
gcd
(
i
,
n
)
φ
d
=\sum_{i=1}^n\sum_{d|\gcd(i,n)}\varphi_d
=i=1∑nd∣gcd(i,n)∑φd
我们知道,一个数是
gcd
(
a
,
b
)
\gcd(a,b)
gcd(a,b)的因数,意味着它既整除
a
a
a又整除
b
b
b。
那么,如果枚举
d
d
d取遍
1
1
1到
n
n
n的所有值(
n
n
n是
d
d
d的最大可能值),然后在
φ
d
\varphi_d
φd前面乘上满足的条件,也就是
[
d
∣
i
]
[
d
∣
j
]
[d|i][d|j]
[d∣i][d∣j],不就一样了吗?
=
∑
i
=
1
n
∑
d
=
1
n
[
d
∣
i
]
[
d
∣
n
]
φ
d
=\sum_{i=1}^n\sum_{d=1}^n[d|i][d|n]\varphi_d
=i=1∑nd=1∑n[d∣i][d∣n]φd
显然,满足
[
d
∣
n
]
=
1
[d|n]=1
[d∣n]=1的时候,
d
d
d是
n
n
n的因数。因此我们先把它放到条件里面去。条件中两个都是常数,可以放到条件里。
=
∑
i
=
1
n
∑
d
∣
n
[
d
∣
i
]
φ
d
=\sum_{i=1}^n\sum_{d|n}[d|i]\varphi_d
=i=1∑nd∣n∑[d∣i]φd
我们发现
d
d
d的枚举与
i
i
i毫无关系,于是可以任意调换和号的位置。
=
∑
d
∣
n
∑
i
=
1
n
[
d
∣
i
]
φ
d
=\sum_{d|n}\sum_{i=1}^n[d|i]\varphi_d
=d∣n∑i=1∑n[d∣i]φd
因为是先枚举的
d
d
d,因此在枚举
i
i
i的时候,
d
d
d相当于已经成为常数了。因此
φ
d
\varphi_d
φd也是常数,我们可以把它提到外面去(乘法分配律)。
=
∑
d
∣
n
φ
d
∑
i
=
1
n
[
d
∣
i
]
=\sum_{d|n}\varphi_d\sum_{i=1}^n[d|i]
=d∣n∑φdi=1∑n[d∣i]
现在我们考察最后一个条件,
d
d
d是确定的,要使
i
i
i是
d
d
d的倍数,
∑
i
=
1
n
[
d
∣
i
]
\sum_{i=1}^n[d|i]
∑i=1n[d∣i]事实上就是求小于等于
n
n
n的范围内
d
d
d的倍数的个数。那不就直接除一下就是答案吗。
=
∑
d
∣
n
φ
d
⌊
n
d
⌋
=\sum_{d|n}\varphi_d\lfloor\frac{n}{d}\rfloor
=d∣n∑φd⌊dn⌋
学了DDZ重排,我们再来看由它得到的显然的几个结论。
重排变换
∑
i
=
1
n
∑
d
∣
gcd
(
i
,
n
)
f
d
=
∑
d
∣
n
f
d
⌊
n
d
⌋
\sum_{i=1}^n\sum_{d|\gcd(i,n)}f_d=\sum_{d|n}f_d\lfloor\frac{n}{d}\rfloor
∑i=1n∑d∣gcd(i,n)fd=∑d∣nfd⌊dn⌋
混合重排变换
∑
i
=
1
n
∑
d
∣
gcd
(
i
,
m
)
f
d
=
∑
d
∣
m
f
d
⌊
n
d
⌋
\sum_{i=1}^n\sum_{d|\gcd(i,m)}f_d=\sum_{d|m}f_d\lfloor\frac{n}{d}\rfloor
∑i=1n∑d∣gcd(i,m)fd=∑d∣mfd⌊dn⌋
扩展混合重排变换
∑
i
=
1
n
∑
d
∣
gcd
(
i
,
m
)
f
d
g
i
=
∑
d
∣
m
f
d
∑
i
=
1
⌊
n
d
⌋
g
i
d
\sum_{i=1}^n\sum_{d|\gcd(i,m)}f_dg_i=\sum_{d|m}f_d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}g_{id}
∑i=1n∑d∣gcd(i,m)fdgi=∑d∣mfd∑i=1⌊dn⌋gid
其中第三个用到了扩展变换,如下
扩展变换
∑
i
=
1
n
[
d
∣
i
]
f
i
=
∑
i
=
1
⌊
n
d
⌋
f
i
d
\sum_{i=1}^n[d|i]f_i=\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}f_{id}
∑i=1n[d∣i]fi=∑i=1⌊dn⌋fid
除此之外,还有一个新等式和两个重要的新变换
等式三
∑
d
∣
n
μ
d
d
=
φ
n
n
\sum_{d|n}\frac{\mu_d}{d}=\frac{\varphi_n}{n}
∑d∣ndμd=nφn
收缩变换
∑
i
=
1
n
∑
d
∣
i
f
d
=
∑
i
=
1
n
∑
d
=
1
⌊
n
i
⌋
f
d
\sum_{i=1}^n\sum_{d|i}f_d=\sum_{i=1}^n\sum_{d=1}^{\lfloor\frac{n}{i}\rfloor}f_d
∑i=1n∑d∣ifd=∑i=1n∑d=1⌊in⌋fd
扩展变换和收缩变换都可以把枚举因数变成枚举前缀。注意扩展变换中变量是
i
i
i,而收缩变换中变量是
d
d
d。
杜教筛变换
∑
i
=
1
n
∑
d
∣
i
f
d
g
i
d
=
∑
i
=
1
n
g
i
∑
d
=
1
⌊
n
i
⌋
f
d
\sum_{i=1}^n\sum_{d|i}f_dg_{\frac{i}{d}}=\sum_{i=1}^ng_i\sum_{d=1}^{\lfloor\frac{n}{i}\rfloor}f_d
∑i=1n∑d∣ifdgdi=∑i=1ngi∑d=1⌊in⌋fd
12.24写为
[
1
,
n
]
[
i
]
f
∗
g
=
[
1
,
n
]
g
(
i
)
f
(
[
1
,
⌊
n
i
⌋
]
)
[1,n][i]f*g=[1,n]g(i)f([1,\lfloor\frac{n}{i}\rfloor])
[1,n][i]f∗g=[1,n]g(i)f([1,⌊in⌋])
不能构造收缩变换的时候,可以构造一个
g
x
g_x
gx,然后构造杜教筛变换。
若前缀和可以线性预处理则复杂度为
O
(
n
2
3
)
O(n^{\frac{2}{3}})
O(n32),否则复杂度为
O
(
n
3
4
)
O(n^{\frac{3}{4}})
O(n43)。
上一篇博客讲了构造收缩变换,这里讲一道杜教筛变换。
【例题】求
∑
i
=
1
n
φ
i
i
\sum_{i=1}^n\varphi_ii
∑i=1nφii。
我们要找一个与
φ
i
i
\varphi_ii
φii有关的式子。
如果只有
φ
i
\varphi_i
φi的话,我们有
∑
d
∣
n
φ
d
=
n
\sum_{d|n}\varphi_d=n
∑d∣nφd=n,然后套个前缀就可以收缩变换了。
构造杜教筛变换的要点是找到一个函数
g
n
d
g_\frac{n}{d}
gdn,使与原来的
f
d
f_d
fd乘起来可以套用公式。
这个
i
i
i很烦,考虑把它吃掉。
于是构造式子
∑
d
∣
n
φ
d
d
n
d
=
n
2
\sum_{d|n}\varphi_dd\frac{n}{d}=n^2
d∣n∑φdddn=n2
为什么右边是
n
2
n^2
n2应该比较显然吧。这里我们把
n
d
\frac{n}{d}
dn当做
g
d
g_d
gd,套一个前缀:
∑
i
=
1
n
∑
d
∣
i
φ
d
d
i
d
=
∑
i
=
1
n
i
2
\sum_{i=1}^n\sum_{d|i}\varphi_dd\frac{i}{d}=\sum_{i=1}^ni^2
i=1∑nd∣i∑φdddi=i=1∑ni2
直接套杜教筛变换。(对照上面的式子看一下)
∑
i
=
1
n
i
∑
d
=
1
⌊
n
i
⌋
φ
d
d
=
n
(
n
+
1
)
(
2
n
+
1
)
6
\sum_{i=1}^ni\sum_{d=1}^{\lfloor\frac{n}{i}\rfloor}\varphi_dd=\frac{n(n+1)(2n+1)}{6}
i=1∑nid=1∑⌊in⌋φdd=6n(n+1)(2n+1)
∑
i
=
1
n
i
S
⌊
n
i
⌋
=
n
(
n
+
1
)
(
2
n
+
1
)
6
\sum_{i=1}^niS_{\lfloor\frac{n}{i}\rfloor}=\frac{n(n+1)(2n+1)}{6}
i=1∑niS⌊in⌋=6n(n+1)(2n+1)
S
n
+
∑
i
=
2
n
i
S
⌊
n
i
⌋
=
n
(
n
+
1
)
(
2
n
+
1
)
6
S_n+\sum_{i=2}^niS_{\lfloor\frac{n}{i}\rfloor}=\frac{n(n+1)(2n+1)}{6}
Sn+i=2∑niS⌊in⌋=6n(n+1)(2n+1)
S
n
=
n
(
n
+
1
)
(
2
n
+
1
)
6
−
∑
i
=
2
n
i
S
⌊
n
i
⌋
S_n=\frac{n(n+1)(2n+1)}{6}-\sum_{i=2}^niS_{\lfloor\frac{n}{i}\rfloor}
Sn=6n(n+1)(2n+1)−i=2∑niS⌊in⌋
然后就杜教筛
O
(
n
2
3
)
O(n^\frac{2}{3})
O(n32)求。
补充:约数个数变换:
d
n
m
=
∑
i
∣
n
∑
j
∣
m
[
gcd
(
i
,
j
)
=
1
]
d_{nm}=\sum_{i|n}\sum_{j|m}[\gcd(i,j)=1]
dnm=∑i∣n∑j∣m[gcd(i,j)=1] (SDOI2015)
20180927补充:
∑
i
∣
n
μ
(
i
)
=
0
(
n
>
1
)
\sum_{i|n}\mu(i)=0(n>1)
∑i∣nμ(i)=0(n>1)
2018.12.16 可能有用这个等式: μ ( a b ) = [ gcd ( a , b ) = 1 ] μ ( a ) μ ( b ) \mu(ab)=[\gcd(a,b)=1]\mu(a)\mu(b) μ(ab)=[gcd(a,b)=1]μ(a)μ(b)。即考虑 μ \mu μ在什么时候为 0 0 0。