除法分块及其应用

前言

除法分块,是数论题中一个比较常见的优化技巧,可以将某些(O(n))算法优化成(O(sqrt n))

主要思想

让我们来看一下这个式子:(sum_{i=1}^Nlfloorfrac Ni floor)

不难发现,在一定范围内(lfloorfrac Ni floor)的值是保持不变的(这个范围是(isimlfloorfrac N{lfloorfrac Ni floor} floor))。

如果用(l)表示(i)(r)表示(lfloorfrac N{lfloorfrac Ni floor} floor),由于这段的值是一样的(均为(lfloorfrac Ni floor)),而个数又是已知的(即(r-l+1)个),所以我们可以快速算出这一段值的和为((r-l+1)*lfloorfrac Ni floor)

也就是说,在值不变的情况下,我们是可以(O(1))求解答案的。

(lfloorfrac Ni floor)的值实际上总共只有大约(sqrt N)种。

于是,我们就将(O(N))优化至了(O(sqrt N))

推广

但除法分块不只限于这一个方面,实际上,对于带整除的函数它也能搞。

如求(sum_{i=1}^Nmu(lfloorfrac Ni floor))

我们可以像前面一样表示出(i,l,r),则每次答案就是((r-l+1)*mu(lfloorfrac Ni floor))

时间复杂度同样得到了极大的优化。

具体应用

有一道比较好的除法分块的例题:【BZOJ1257】[CQOI2007] 余数之和

当然,除法分块的应用还是十分广泛的,例如莫比乌斯反演的题目中就常常可以见到它的身影:

【洛谷2257】YY的GCD

【BZOJ1101】[POI2007] Zap

【BZOJ3994】[SDOI2015] 约数个数和

这些都是比较经典的题目吧。

原文地址:https://www.cnblogs.com/chenxiaoran666/p/divide.html