整除分块学习笔记
其实一直没有把整除分块看成一个算法,只看成一个思维。然后发现我不会思维了,于是来补一下学习笔记。
看一道例题:UVA11526
就是求\(\sum\limits_{i=1}^{n}{⌊\frac{n}{i}⌋}\)
我们发现很多值都是一样的,所以可以快速计算掉。
具体的,我们发现\(i\)到\(⌊\frac{n}{⌊\frac{n}{i}⌋}⌋\)内所有数是一样的。
那么就可以\(O(\sqrt n)\)计算了。
但是出题人通常不会让你这么好过。
比如\(\sum\limits_{i=1}^{\min(n,m)}{⌊\frac{n}{i}⌋⌊\frac{m}{i}⌋}\)
那么我们要这两个在一个区间内都相同,所以两个要取\(\max\),复杂度是\(O(\max(\sqrt n,\sqrt m))\)
再比如\(\sum\limits_{i=1}^{n}{μ(i)⌊\frac{n}{i}⌋}\)
那么我们对于同样的值,我们要知道的是\(μ(i)\)在这一段区间内的值。
所以欧拉筛筛出来以后前缀和即可。这种东西不可能一次询问因为欧拉筛都\(O(n)\)了,一定是多次询问。复杂度\(O(n+q\sqrt n)\)
这个东西在莫反里面特别有用。
几道例题:
[CQOI2007]余数求和
CF1485C 题解