整除分块

当我去写数学题的时候化简\(a \mod b\to a-\lfloor\frac{a}{b} \rfloor*b\)\(O(n)\)之后开心坏了,结果发现数据范围:\(1≤n,m≤1e9\)(吐血),然后看了题解苦思冥想,发现整除分块可以将时间复杂度优化到\(O(\sqrt n)\)

整除分块:可以用到整除分块的形式,大致是这样的\(\sum_{i=1}^{n}\lfloor \frac{n}{i} \rfloor\)
打表可以发现对于每一个\(\lfloor \frac {n}{i}\rfloor\)的值是一样的,而且它们呈现块状分布,再通过打表发现对于每一个值相同的块,最后一个数为\(n/(n/i)\)。得出这个结论之后可以做\(O(\sqrt n)\)的处理

for(int l=1,r;l<=n;l=r+1){
	r=(n)/(n/l);
	ans+=(r-l+1)*(n/l);
}

与其他函数的联系

  • 有时候,可能推出来的式子不一定就是一个很裸的整除分块,可能会与某些积性函数相乘,如:μ,φ...... 这时候,我们就需要对这些函数统计一个前缀和。因为,每当我们使用整除分块跳过一个区间的时候,其所对应的函数值也跳过了一个区间。所以此时,就需要乘上那一个区间的函数值。
posted @ 2021-07-14 19:42  无琛  阅读(51)  评论(0)    收藏  举报