前言
除法分块,是数论题中一个比较常见的优化技巧,可以将某些(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] 余数之和。
当然,除法分块的应用还是十分广泛的,例如莫比乌斯反演的题目中就常常可以见到它的身影:
这些都是比较经典的题目吧。