问题引入
其中n <= 1000000000
显然暴力求解是一种效率很低下的方法
我们很容易想到n除以很多数向下取整的话得到的结果是一样的,对于n除以任意不大于n的正整数的结果显然在1到n之间
如果我们能按照结果把1到n的数字分块。假如对于 1 <= k <= n , 满足的范围为[l , r],对于这个区间上的和就是
(r - l + 1) * k
我们枚举l , 分别算出每个l对应的k,然后加上结果即可
那么如何去求这个区间呢
这里直接给出方法:r = n / (n / l)
代码
//#define ll long long
ll n = read();
ll ans = 0;
for (ll l = 1, r; l <= n; l = r + 1)
{
r = n / (n / l);
ans += (n / l) * (r - l + 1);
}
cout << ans;