题目很裸,求∑i=1~n⌊n/i⌋
这个东西可以直接暴力O(n),但对于这个复杂度来说显然不优秀
直接枚举的话会发现很多项的值都是相同的,而且呈块状分布,那么就可以用道整除分块来解决
有一篇博客讲了证明写的还行https://www.cnblogs.com/0xfffe/p/9648943.html
好了现在我们就可以在sqrt(n)的时间内求出这个值了
然鹅整除分块经常套这莫反,有时需要求mu或者phi的前缀和,就需要用到杜教筛,然后我不会就溜了
结论:一个值相同的块的最后一个元素是n/(n/i)
贴代码走人
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int n;
long long ans = 0;
int main() {
scanf("%d", &n);
for (int lf = 1, rg; lf <= n; lf = rg + 1) {
rg = n / (n / lf);
ans += 1LL * (rg - lf + 1) * (n / lf);
}
cout << ans << endl;
return 0;
}