首先我们先引入一个问题:
∑
i
−
1
n
n
i
\sum{^n_{i-1} \frac{n}{i}}
∑i−1nin
然后对于这个式子,n<=1e7我们还可以尝试暴力暴力,但是n到了更大的数比如1e12这样我们显然不能暴力了。那么我们就引入整除分块,他 整除分块对我们后面的莫比乌斯反演有很大的帮助
然后我们就看下取整这一行,找这一行的规律,从前往后并不好看出什么规律,最好是从后往前看,因为我们已经把相同下取整结果归为一组,
然后我们看20其实就是最后一组的右端点,10是结果为第7组的右端点,10其实是n/2,而11就是n/2+1,这样我们往前推一个就是6=n/3,第7组的左端点是7=n/3+1…这样我们一步步的往前推。
而每组的结果就是
n
n
n
/
/
/ 这一组的右端点,而每组下取整结果个数就是
右
端
点
−
左
端
点
右端点-左端点
右端点−左端点 所以这一组对结果产生的代价就是
(
右
端
点
−
左
端
点
)
∗
(
n
/
右
端
点
)
(右端点-左端点)*(n/右端点)
(右端点−左端点)∗(n/右端点)
接下来细致的看下下图,再分析一遍
先说一下他最大有
2
∗
n
2*\sqrt n
2∗n组,之所以最大有这么多组就是因为前
n
\sqrt n
n ,
(
i
<
=
n
)
(i<=\sqrt n)
(i<=n)个,
n
/
i
n/i
n/i最多有
n
\sqrt n
n个,大于
n
\sqrt n
n的时候,他的另一个乘数一定小于
n
\sqrt n
n因为 一个大于
n
\sqrt n
n的数要是在乘以另一个大于
n
\sqrt n
n的数那么他肯定大于
n
\sqrt n
n
for(int l=1,r;l<=n;l=r+1){
r=n/(n/l);
sum+=(r-l+1)*(n/l);
}