思考如何计算以下算式:
\[\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\) 为例:
容易发现:
这样我们就把10的计算转化为只需要5次的计算:
核心代码:
ll res = 0;
for(int l = 1, r; l <= n; l = r + 1)
{
r = n / (n / l);//定义右边界
res += (r - l + 1) * (n / l);
}
参考博客:https://blog.csdn.net/pythpnhh/article/details/119805692
标签:10,分块,整数,算法,ACM,计算 From: https://www.cnblogs.com/marti88414/p/17743475.html