假如你要求数论函数
f
(
n
)
f(n)
f(n)的前缀和
F
(
n
)
F(n)
F(n),要求比线性更快的复杂度
如果我们能构造一个数论函数
g
(
n
)
g(n)
g(n)使得
h
=
f
∗
g
h=f*g
h=f∗g(
∗
*
∗为狄利克雷卷积)的前缀和计算很容易
那么我们有如下变换:
∑
i
=
1
n
h
(
i
)
=
∑
i
=
1
n
∑
d
∣
i
g
(
d
)
∗
f
(
i
d
)
=
∑
d
=
1
n
g
(
d
)
∑
d
∣
i
f
(
i
d
)
=
∑
d
=
1
n
g
(
d
)
∑
i
=
1
⌊
n
d
⌋
f
(
i
)
=
∑
d
=
1
n
g
(
d
)
F
(
⌊
n
d
⌋
)
\sum_{i=1}^nh(i)=\sum_{i=1}^n\sum_{d|i} g(d)*f(\frac{i}{d})=\sum_{d=1}^ng(d)\sum_{d|i}f(\frac{i}{d})\\ =\sum_{d=1}^ng(d)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}f(i)=\sum_{d=1}^ng(d)F(\left\lfloor\frac{n}{d}\right\rfloor)
i=1∑nh(i)=i=1∑nd∣i∑g(d)∗f(di)=d=1∑ng(d)d∣i∑f(di)=d=1∑ng(d)i=1∑⌊dn⌋f(i)=d=1∑ng(d)F(⌊dn⌋)
那么就有
g
(
1
)
F
(
n
)
=
∑
i
=
1
n
h
(
i
)
−
∑
i
=
2
n
g
(
i
)
F
(
⌊
n
i
⌋
)
g(1)F(n)=\sum_{i=1}^nh(i)-\sum_{i=2}^ng(i)F(\left\lfloor \frac{n}{i} \right\rfloor)
g(1)F(n)=i=1∑nh(i)−i=2∑ng(i)F(⌊in⌋)
然后我们就可以记忆化搜索了
只要我们预处理了前
n
2
3
n^{\frac{2}{3}}
n32的值,加上记忆化搜索就可以做到复杂度为
n
2
3
n^{\frac{2}{3}}
n32
复杂度证明:
假设我们预处理的是
n
\sqrt{n}
n内的数,设
T
(
n
)
T(n)
T(n)为计算
F
(
n
)
F(n)
F(n)的时间
则
T
(
n
)
=
∑
i
=
1
n
T
(
i
)
+
∑
i
=
1
n
T
(
⌊
n
i
⌋
)
+
n
=
O
(
∑
i
=
1
n
i
)
+
O
(
∑
i
=
1
n
⌊
n
i
⌋
)
+
O
(
n
)
=
O
(
∫
0
n
⌊
n
i
⌋
d
x
)
=
O
(
n
3
4
)
T(n)=\sum_{i=1}^{\sqrt{n}}T(i)+\sum_{i=1}^{\sqrt{n}}T(\left\lfloor \frac{n}{i} \right\rfloor) +\sqrt{n}\\ =O(\sum_{i=1}^{\sqrt{n}}\sqrt{i})+O(\sum_{i=1}^{\sqrt{n}}\sqrt{\left\lfloor \frac{n}{i} \right\rfloor}) +O(\sqrt{n})\\ =O(\int_0^{\sqrt{n}}\sqrt{\left\lfloor \frac{n}{i} \right\rfloor}dx)=O(n^{\frac{3}{4}})
T(n)=i=1∑nT(i)+i=1∑nT(⌊in⌋)+n=O(i=1∑ni)+O(i=1∑n⌊in⌋)+O(n)=O(∫0n⌊in⌋dx)=O(n43)
如果取
n
2
3
n^{\frac{2}{3}}
n32
复杂度就为
O
(
∫
0
n
1
3
⌊
n
x
⌋
d
x
)
=
O
(
n
2
3
)
O(\int_0^{n^{\frac{1}{3}}} \sqrt{\left\lfloor \frac{n}{x} \right\rfloor}dx) = O(n^{\frac{2}{3}})
O(∫0n31⌊xn⌋dx)=O(n32)
具体例题看其他博客啦