【ACM算法】整数分块

发布时间 2023-10-05 16:14:48作者: marti88414

思考如何计算以下算式:

\[\sum_{i=1}^{n} \lfloor \frac{n}{i} \rfloor \qquad (n \le 10^6) \]

所有人都会觉得这个非常简单,一个for循环可以直接解决,时间复杂度 \(O(n)\),但是如果将 \(n\) 的范围改大一点点,改成 \(n\leq 10^{12}\) 呢?这时如果我们用朴素算法一定会T;

但是我们可以手打个表看看规律,以 \(n =10\) 为例:

img

容易发现:

img

这样我们就把10的计算转化为只需要5次的计算:

img

核心代码:

ll res = 0;
for(int l = 1, r; l <= n; l = r + 1)
{
	r = n / (n / l);//定义右边界 
	res += (r - l + 1) * (n / l);
}

例题:newcoder Dividing

参考博客:https://blog.csdn.net/pythpnhh/article/details/119805692