首先我们先引入一个问题:

整除分块_分块

整除分块_取整_02

然后对于这个式子,n<=1e7我们还可以尝试暴力暴力,但是n到了更大的数比如1e12这样我们显然不能暴力了。那么我们就引入整除分块,他 整除分块对我们后面的莫比乌斯反演有很大的帮助

整除分块_整除_03


然后我们就看下取整这一行,找这一行的规律,从前往后并不好看出什么规律,最好是从后往前看,因为我们已经把相同下取整结果归为一组,

整除分块_取整_04


然后我们看20其实就是最后一组的右端点,10是结果为第7组的右端点,10其实是n/2,而11就是n/2+1,这样我们往前推一个就是6=n/3,第7组的左端点是7=n/3+1…这样我们一步步的往前推。

而每组的结果就是整除分块_取整_05 整除分块_整除_06 这一组的右端点,而每组下取整结果个数就是整除分块_分块_07 所以这一组对结果产生的代价就是整除分块_分块_08

接下来细致的看下下图,再分析一遍

整除分块_分块_09


先说一下他最大有整除分块_分块_10组,之所以最大有这么多组就是因为前 整除分块_取整_11 ,整除分块_分块_12个,整除分块_取整_13最多有整除分块_取整_11个,大于整除分块_取整_11的时候,他的另一个乘数一定小于整除分块_取整_11因为 一个大于整除分块_取整_11的数要是在乘以另一个大于整除分块_取整_11的数那么他肯定大于整除分块_取整_11

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