这题在原本 std 的复杂度是 Θ ( r ) \Theta(\sqrt r) Θ(r) 的,本人在验题过程中给出的算法复杂度为 Θ ( r 3 7 ) \Theta(r^{\frac 37}) Θ(r73)。算是非常规整除分块的一点探索吧。
思路要点
考虑将两个数乘积为平方数当且仅当所含有的次数为奇数的素因子集合,因此这就构成了一个等价关系。等价类内的数显然应当挨在一起放,故得到:答案为区间长度减去出现的等价类数量。因此等价类数量可以刻画成
∑
x
≤
r
∣
μ
(
x
)
∣
[
⌊
r
x
⌋
>
⌊
l
−
1
x
⌋
]
\sum_{x\le r} |\mu(x)| \left[ \left\lfloor\sqrt{\frac rx}\right\rfloor > \left\lfloor\sqrt{\frac {l-1}x}\right\rfloor\right]
x≤r∑∣μ(x)∣[⌊xr⌋>⌊xl−1⌋]
注意后项由于形如
⌊
r
x
⌋
\left\lfloor\sqrt{\frac rx}\right\rfloor
⌊xr⌋ 的式子取值类似于除法分块,我们可以考虑计算若干个部分的
∑
x
≤
t
∣
μ
(
t
)
∣
\sum_{x\le t} |\mu(t)|
∑x≤t∣μ(t)∣,不难通过莫比乌斯函数筛出无平方因子的数的数量
F
(
t
)
=
∑
x
≤
t
∣
μ
(
x
)
∣
=
∑
d
≤
t
μ
(
d
)
⌊
t
d
2
⌋
F(t)=\sum_{x\le t} |\mu(x)| = \sum_{d\le \sqrt t} \mu(d) \left\lfloor \frac{t}{d^2} \right\rfloor
F(t)=x≤t∑∣μ(x)∣=d≤t∑μ(d)⌊d2t⌋
复杂度分析
考察形如 ⌊ t d 2 ⌋ \left\lfloor \frac{t}{d^2} \right\rfloor ⌊d2t⌋ 的式子在 d d d 变化时有多少种取值。设一个参数 B B B,显然对于 d ≤ B d\le B d≤B 最多 B B B 种取值,对于 d > B d>B d>B,有 t d 2 < t B 2 \frac t{d^2} < \frac{t}{B^2} d2t<B2t,因此不超过 B + t B 2 B + \frac{t}{B^2} B+B2t 种取值。令 B = t 1 3 B=t^\frac13 B=t31 可知只有 O ( t 1 3 ) O(t^\frac13) O(t31) 种取值,因此计算 F ( t ) F(t) F(t) 的复杂度理论上可以达到 Θ ( t 1 3 ) \Theta(t^\frac13) Θ(t31),但需要对于 μ \mu μ 的前缀和进行预处理。具体预处理的方法在最后给出复杂度分析。
考虑将答案的式子分块 M M M,对于 x ≤ M x\le M x≤M 的部分对 x x x 线性筛进行计算,剩余部分通过整除分块求 F ( t ) F(t) F(t) 进行计算。
对于
x
>
M
x>M
x>M,假设取值
v
=
r
x
<
r
M
v = \sqrt{\frac rx} < \sqrt{\frac r M}
v=xr<Mr,复杂度可表示为
∑
v
<
r
M
(
r
v
2
)
1
3
∼
∫
0
r
M
(
r
v
2
)
1
3
d
v
=
r
1
3
∫
0
r
M
v
−
2
3
d
v
=
3
r
1
3
v
1
3
∣
v
=
0
r
M
=
3
r
1
2
M
−
1
6
\begin{aligned}\sum_{v < \sqrt{\frac rM}} \left(\frac r {v^2}\right)^{\frac13} & \sim\int_0^{\sqrt{\frac rM}} \left(\frac r {v^2}\right)^{\frac13} \mathrm{d}v\\&= r^\frac13 \int_0^{\sqrt{\frac rM}} v^{-\frac23} \mathrm{d}v\\&= \left.3 r^{\frac13} v^{\frac13} \right|_{v=0}^{\sqrt{\frac rM}}\\&= 3r^\frac12 M^{-\frac16}\end{aligned}
v<Mr∑(v2r)31∼∫0Mr(v2r)31dv=r31∫0Mrv−32dv=3r31v31∣∣∣v=0Mr=3r21M−61
注意最终的复杂度要与
M
M
M 求和,取
M
=
r
3
7
M=r^{\frac37}
M=r73,于是这一部分计算的复杂度为
Θ
(
r
3
7
)
\Theta(r^\frac37)
Θ(r73)。
最后讨论
μ
\mu
μ 前缀和的预处理,考虑使
v
=
⌊
r
x
⌋
v=\left\lfloor\sqrt{\frac rx}\right\rfloor
v=⌊xr⌋ ,当
x
x
x 变大时,取值改变的
x
x
x,注意到可以表示为
x
=
⌊
r
v
2
⌋
x=\left\lfloor\frac r{v^2}\right\rfloor
x=⌊v2r⌋,接着带回到
F
(
t
)
F(t)
F(t) 的式子中观察,其中
d
d
d 改变值
w
=
⌊
t
d
2
⌋
w=\left\lfloor\frac t{d^2}\right\rfloor
w=⌊d2t⌋ 的位置就是
d
=
⌊
t
w
⌋
d=\left\lfloor\sqrt \frac tw \right\rfloor
d=⌊wt⌋。带入
t
=
⌊
r
v
2
⌋
t=\left\lfloor\frac r{v^2}\right\rfloor
t=⌊v2r⌋ 得到
d
=
⌊
r
v
2
w
⌋
=
⌊
⌊
r
w
⌋
v
⌋
\begin{aligned} d&=\left\lfloor \sqrt{\frac r{v^2w}}\right\rfloor\\&=\left\lfloor \frac{\left\lfloor\sqrt{\dfrac r{w}}\right\rfloor}v \right\rfloor\end{aligned}
d=⌊v2wr⌋=⎣⎢⎢⎢⎢⎢v⌊wr⌋⎦⎥⎥⎥⎥⎥
注意杜教筛的递归式中可以算出某个
m
m
m 对应的所有
⌊
m
d
⌋
\left\lfloor \frac m d\right\rfloor
⌊dm⌋ 的位置处的取值,我们将
≤
N
\le N
≤N 位置的值线性筛预处理,剩余部分由
r
w
>
N
\sqrt\frac rw > N
wr>N 的负责计算,保守估计复杂度为
∑
w
≤
r
N
2
(
r
w
)
2
3
∼
∫
0
r
N
2
(
r
w
)
2
3
d
w
=
r
1
3
∫
0
r
N
2
w
−
1
3
d
w
=
3
2
r
1
3
w
2
3
∣
w
=
0
r
N
2
=
3
2
r
N
−
4
3
\begin{aligned}\sum_{w\le \frac r{N^2}} \left(\sqrt \frac rw\right)^\frac23 &\sim \int_0^{\frac r{N^2}} \left(\sqrt \frac rw\right)^\frac23 \mathrm{d}w\\&= r^\frac13 \int _0^{\frac r{N^2}} w^{-\frac13} \mathrm{d}w\\&= \left.\frac32 r^\frac13 w^\frac23 \right|_{w=0}^{\frac r{N^2}}\\&= \frac32 r N^{-\frac43}\end{aligned}
w≤N2r∑(wr)32∼∫0N2r(wr)32dw=r31∫0N2rw−31dw=23r31w32∣∣∣∣w=0N2r=23rN−34
注意要加上预处理的时间,分块大小为
N
=
r
3
7
N=r^\frac37
N=r73 时,复杂度取到最优值
Θ
(
r
3
7
)
\Theta(r^\frac37)
Θ(r73)。
综上所述,各部分时间复杂度均为 Θ ( r 3 7 ) \Theta(r^\frac37) Θ(r73),故本算法的时间复杂度为 Θ ( r 3 7 ) \Theta(r^\frac37) Θ(r73)。
后记
由于现代计算机还是太菜,这两个算法跑得差不多。毕竟本算法的常数大一些,有很多预处理的部分。
在 l , r l, r l,r 相离较远的时候,很多区间可以合并,这一性质是否有可能进行进一步的刻画?对于本题来说可能是进一步的优化空间。