余数之和(O(sqrt(K)))
k mod i = k - floor(k/i)*i
等差数列求和公式
#include<bits/stdc++.h>
using namespace std;
long long n,k,ans;
int main()
{
cin >> n>> k;
ans = n * k; // 这里先把公式里的"k-"放在这里
for(int x = 1, gx;x <= n; x = gx + 1)
{
gx = k/x ? min(k/(k/x), n) : n; // 这里,正常来说就是k/(k/x),但要考虑到n大于k的情况,那时,x就会大于k,以及考虑最后一个的情况,也就是要尾项为n
ans -= (k/x) * (x + gx) * (gx - x + 1) / 2;//这里,(k/x)*x为首项,(k/x)*gx为尾项,(gx-x+1)为项数,通过套用等差数列求和公式可得上式
}
cout << ans;
}