非常规整除分块初探——验题【XR-2】记忆

本文探讨了一种非常规的整除分块算法,用于优化特定数学问题的解决效率。该算法将原本Θ(r)的复杂度降低至Θ(r^(3/7)),通过对莫比乌斯函数的巧妙应用和预处理,实现了对无平方因子数计数的有效计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这题在原本 std 的复杂度是 Θ(r)\Theta(\sqrt r)Θ(r) 的,本人在验题过程中给出的算法复杂度为 Θ(r37)\Theta(r^{\frac 37})Θ(r73)。算是非常规整除分块的一点探索吧。

思路要点

考虑将两个数乘积为平方数当且仅当所含有的次数为奇数的素因子集合,因此这就构成了一个等价关系。等价类内的数显然应当挨在一起放,故得到:答案为区间长度减去出现的等价类数量。因此等价类数量可以刻画成
∑x≤r∣μ(x)∣[⌊rx⌋>⌊l−1x⌋]\sum_{x\le r} |\mu(x)| \left[ \left\lfloor\sqrt{\frac rx}\right\rfloor > \left\lfloor\sqrt{\frac {l-1}x}\right\rfloor\right]xrμ(x)[xr>xl1]
注意后项由于形如 ⌊rx⌋\left\lfloor\sqrt{\frac rx}\right\rfloorxr 的式子取值类似于除法分块,我们可以考虑计算若干个部分的 ∑x≤t∣μ(t)∣\sum_{x\le t} |\mu(t)|xtμ(t),不难通过莫比乌斯函数筛出无平方因子的数的数量
F(t)=∑x≤t∣μ(x)∣=∑d≤tμ(d)⌊td2⌋F(t)=\sum_{x\le t} |\mu(x)| = \sum_{d\le \sqrt t} \mu(d) \left\lfloor \frac{t}{d^2} \right\rfloorF(t)=xtμ(x)=dtμ(d)d2t

复杂度分析

考察形如 ⌊td2⌋\left\lfloor \frac{t}{d^2} \right\rfloord2t 的式子在 ddd 变化时有多少种取值。设一个参数 BBB,显然对于 d≤Bd\le BdB 最多 BBB 种取值,对于 d&gt;Bd&gt;Bd>B,有 td2&lt;tB2\frac t{d^2} &lt; \frac{t}{B^2}d2t<B2t,因此不超过 B+tB2B + \frac{t}{B^2}B+B2t 种取值。令 B=t13B=t^\frac13B=t31 可知只有 O(t13)O(t^\frac13)O(t31) 种取值,因此计算 F(t)F(t)F(t) 的复杂度理论上可以达到 Θ(t13)\Theta(t^\frac13)Θ(t31),但需要对于 μ\muμ 的前缀和进行预处理。具体预处理的方法在最后给出复杂度分析。

考虑将答案的式子分块 MMM,对于 x≤Mx\le MxM 的部分对 xxx 线性筛进行计算,剩余部分通过整除分块求 F(t)F(t)F(t) 进行计算。

对于 x&gt;Mx&gt;Mx>M,假设取值 v=rx&lt;rMv = \sqrt{\frac rx} &lt; \sqrt{\frac r M}v=xr<Mr,复杂度可表示为
∑v&lt;rM(rv2)13∼∫0rM(rv2)13dv=r13∫0rMv−23dv=3r13v13∣v=0rM=3r12M−16\begin{aligned}\sum_{v &lt; \sqrt{\frac rM}} \left(\frac r {v^2}\right)^{\frac13} &amp; \sim\int_0^{\sqrt{\frac rM}} \left(\frac r {v^2}\right)^{\frac13} \mathrm{d}v\\&amp;= r^\frac13 \int_0^{\sqrt{\frac rM}} v^{-\frac23} \mathrm{d}v\\&amp;= \left.3 r^{\frac13} v^{\frac13} \right|_{v=0}^{\sqrt{\frac rM}}\\&amp;= 3r^\frac12 M^{-\frac16}\end{aligned}v<Mr(v2r)310Mr(v2r)31dv=r310Mrv32dv=3r31v31v=0Mr=3r21M61
注意最终的复杂度要与 MMM 求和,取 M=r37M=r^{\frac37}M=r73,于是这一部分计算的复杂度为 Θ(r37)\Theta(r^\frac37)Θ(r73)

最后讨论 μ\muμ 前缀和的预处理,考虑使 v=⌊rx⌋v=\left\lfloor\sqrt{\frac rx}\right\rfloorv=xr ,当 xxx 变大时,取值改变的 xxx,注意到可以表示为 x=⌊rv2⌋x=\left\lfloor\frac r{v^2}\right\rfloorx=v2r,接着带回到 F(t)F(t)F(t) 的式子中观察,其中 ddd 改变值 w=⌊td2⌋w=\left\lfloor\frac t{d^2}\right\rfloorw=d2t 的位置就是 d=⌊tw⌋d=\left\lfloor\sqrt \frac tw \right\rfloord=wt。带入 t=⌊rv2⌋t=\left\lfloor\frac r{v^2}\right\rfloort=v2r 得到
d=⌊rv2w⌋=⌊⌊rw⌋v⌋\begin{aligned} d&amp;=\left\lfloor \sqrt{\frac r{v^2w}}\right\rfloor\\&amp;=\left\lfloor \frac{\left\lfloor\sqrt{\dfrac r{w}}\right\rfloor}v \right\rfloor\end{aligned}d=v2wr=vwr
注意杜教筛的递归式中可以算出某个 mmm 对应的所有 ⌊md⌋\left\lfloor \frac m d\right\rfloordm 的位置处的取值,我们将 ≤N\le NN 位置的值线性筛预处理,剩余部分由 rw&gt;N\sqrt\frac rw &gt; Nwr>N 的负责计算,保守估计复杂度为
∑w≤rN2(rw)23∼∫0rN2(rw)23dw=r13∫0rN2w−13dw=32r13w23∣w=0rN2=32rN−43\begin{aligned}\sum_{w\le \frac r{N^2}} \left(\sqrt \frac rw\right)^\frac23 &amp;\sim \int_0^{\frac r{N^2}} \left(\sqrt \frac rw\right)^\frac23 \mathrm{d}w\\&amp;= r^\frac13 \int _0^{\frac r{N^2}} w^{-\frac13} \mathrm{d}w\\&amp;= \left.\frac32 r^\frac13 w^\frac23 \right|_{w=0}^{\frac r{N^2}}\\&amp;= \frac32 r N^{-\frac43}\end{aligned}wN2r(wr)320N2r(wr)32dw=r310N2rw31dw=23r31w32w=0N2r=23rN34
注意要加上预处理的时间,分块大小为 N=r37N=r^\frac37N=r73 时,复杂度取到最优值 Θ(r37)\Theta(r^\frac37)Θ(r73)

综上所述,各部分时间复杂度均为 Θ(r37)\Theta(r^\frac37)Θ(r73),故本算法的时间复杂度为 Θ(r37)\Theta(r^\frac37)Θ(r73)

后记

由于现代计算机还是太菜,这两个算法跑得差不多。毕竟本算法的常数大一些,有很多预处理的部分。

l,rl, rl,r 相离较远的时候,很多区间可以合并,这一性质是否有可能进行进一步的刻画?对于本题来说可能是进一步的优化空间。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值