以下主要的话都用无序列表表示。
诶,是不是应该先讲背景
有什么好讲的?
问一个积性函数的前缀和,项数到1e10。
前置知识
正文
钦定你已经可以再 O ( n ) O(\sqrt{n}) O(n)的复杂度内求出:
∑ i = 1 n ⌊ n i ⌋ \sum_{i=1}^n{\lfloor \frac{n}{i} \rfloor} i=1∑n⌊in⌋
∑ i = 1 n i ∗ ⌊ n i ⌋ \sum_{i=1}^n{i*\lfloor \frac{n}{i} \rfloor} i=1∑ni∗⌊in⌋
对于第一个,先枚举小于 n \sqrt n n的i,得出这段的值;又因为 i i i在一段区间内 ⌊ n i ⌋ \lfloor \frac{n}{i} \rfloor ⌊in⌋都是 i 0 ≤ n i_0\leq \sqrt n i0≤n,因此可以求前式和后式。
- 形式化地讲,若 ∑ i = 1 n f ( i ) ∗ g ( ⌊ n i ⌋ ) \sum_{i=1}^n{f(i)*g(\lfloor \frac{n}{i} \rfloor)} ∑i=1nf(i)∗g(⌊in⌋)中,若能方便的求得 f ( i ) f(i) f(i)的前缀和以及 g ( x ) g(x) g(x),就能方便的求得原式。
然后对于积性函数 f ( i ) f(i) f(i),我们想求 S n = ∑ i = 1 n f ( i ) S_n=\sum_{i=1}^n{f(i)} Sn=∑i=1nf(i)。
那么,我们找一个积性函数
g
g
g,令
T
n
=
∑
d
∣
n
g
(
d
)
∗
f
(
n
d
)
T_n=\sum_{d\mid n}g(d)*f(\frac{n}{d})
Tn=∑d∣ng(d)∗f(dn)(就是狄利克雷卷积)。则有:
∑
i
=
1
n
T
i
=
∑
i
=
1
n
∑
d
∣
i
g
(
d
)
∗
f
(
i
d
)
=
∑
d
=
1
n
g
(
d
)
∗
∑
d
∣
i
,
i
≤
n
f
(
i
d
)
=
∑
d
=
1
n
g
(
d
)
∗
S
⌊
n
d
⌋
\begin{aligned} \sum_{i=1}^n{T_i} & =\sum_{i=1}^n \sum_{d\mid i}{g(d)*f(\frac{i}{d})} \\ & =\sum_{d=1}^n{g(d)*\sum_{d\mid i, i\leq n}{f(\frac{i}{d})}} \\ & =\sum_{d=1}^n{g(d)*S_{\lfloor \frac{n}{d} \rfloor}} \end{aligned}
i=1∑nTi=i=1∑nd∣i∑g(d)∗f(di)=d=1∑ng(d)∗d∣i,i≤n∑f(di)=d=1∑ng(d)∗S⌊dn⌋
然后,钦定
g
(
1
)
=
1
g(1)=1
g(1)=1,那么就有
S
n
=
∑
d
=
1
n
g
(
d
)
∗
S
⌊
n
d
⌋
−
∑
d
=
2
n
g
(
d
)
∗
S
⌊
n
d
⌋
=
∑
i
=
1
n
T
i
−
∑
d
=
2
n
g
(
d
)
∗
S
⌊
n
d
⌋
\begin{aligned} S_n & =\sum_{d=1}^n{g(d)*S_{\lfloor \frac{n}{d} \rfloor}}-\sum_{d=2}^n{g(d)*S_{\lfloor \frac{n}{d} \rfloor}} \\ & =\sum_{i=1}^n{T_i}-\sum_{d=2}^n{g(d)*S_{\lfloor \frac{n}{d} \rfloor}} \end{aligned}
Sn=d=1∑ng(d)∗S⌊dn⌋−d=2∑ng(d)∗S⌊dn⌋=i=1∑nTi−d=2∑ng(d)∗S⌊dn⌋
如果不管怎么求 S ⌊ n d ⌋ S_{\lfloor \frac{n}{d} \rfloor} S⌊dn⌋的话,发现满足以下两个条件就可以求 S n S_n Sn了。
- 可以求g的前缀和
- 可以求T的前缀和
考虑怎么求上式后面的 S ⌊ n d ⌋ S_{\lfloor \frac{n}{d} \rfloor} S⌊dn⌋,由于f是积性函数,必定可以用线性筛筛出前n项,于是可以用线性筛筛了f求出 S 1.. n S_{1..\sqrt n} S1..n,至于大于 n \sqrt{n} n的下标,可以记搜:因为 ⌊ ⌊ n d ⌋ e ⌋ = ⌊ n d ∗ e ⌋ \lfloor \frac{\lfloor \frac{n}{d} \rfloor}{e} \rfloor=\lfloor \frac{n}{d*e} \rfloor ⌊e⌊dn⌋⌋=⌊d∗en⌋,于是可以记录n/d的d,当 d > n d>\sqrt{n} d>n时直接返回结果就行。
- 于是,求前缀和成功转化成用人类智慧求一个g。
模板题
对于 ϕ \phi ϕ,g为1(常值函数),T为i(自然数序列),用到的结论是 x = ∑ d ∣ x p h i d x=\sum_{d\mid x}{phi_d} x=∑d∣xphid。
证明有这样几个方向:
- 证明 ∀ i ∣ n , 1 ≤ j < i , ( i , j ) = 1 \forall i\mid n,1\leq j<i,(i,j)=1 ∀i∣n,1≤j<i,(i,j)=1,都有 i 1 ∗ j 1 ≠ i 2 ∗ j 2 i_1*j_1\neq i_2*j_2 i1∗j1̸=i2∗j2。显然是要被叉翻的(其实是我在用3时不知道干嘛了)。
- 直接通过 ϕ \phi ϕ的计算公式和积性通过一波推理得到一些式子,化简得到n。(巨佬做法)
- 证明 ∀ i ∣ n , 1 ≤ j < i , ( i , j ) = 1 \forall i\mid n,1\leq j<i,(i,j)=1 ∀i∣n,1≤j<i,(i,j)=1,都有 n / i 1 ∗ j 1 ≠ n / i 2 ∗ j 2 n/i_1*j_1\neq n/i_2*j_2 n/i1∗j1̸=n/i2∗j2。显然,因为互质,所以两个都是最简分数,于是当i,j不同时,分数不可能相等,于是证明了任意一个 x ∈ [ 1 , n ] x\in [1,n] x∈[1,n]都只能由一个(i,j)对转移而来,即一一对应,证毕。
以上2的证明:
∑
d
∣
n
ϕ
(
d
)
=
∑
ϕ
(
∏
i
=
1
m
p
i
j
)
=
∑
∏
i
=
1
m
ϕ
(
p
i
j
)
=
∏
i
=
1
m
∑
j
=
0
a
i
ϕ
(
p
i
j
)
=
∏
i
=
1
m
(
∑
j
=
1
a
i
(
p
i
j
−
p
i
j
−
1
)
+
1
)
=
∏
i
=
1
m
p
i
a
i
=
n
\begin{aligned} \sum_{d\mid n}{\phi(d)} & =\sum{\phi(\prod_{i=1}^m{p_i^j})} \\ & =\sum{\prod_{i=1}^m{\phi(p_i^j)}} \\ & =\prod_{i=1}^m{\sum_{j=0}^{a_i}{\phi(p_i^j)}} \\ & =\prod_{i=1}^m{(\sum_{j=1}^{a_i}{(p_i^j-p_i^{j-1})}+1)} \\ & =\prod_{i=1}^m{p_i^{a_i}}=n \end{aligned}
d∣n∑ϕ(d)=∑ϕ(i=1∏mpij)=∑i=1∏mϕ(pij)=i=1∏mj=0∑aiϕ(pij)=i=1∏m(j=1∑ai(pij−pij−1)+1)=i=1∏mpiai=n
然后写出来就可以了。
【代码代填坑】