解题思路:附大佬博客:https://www.acwing.com/solution/content/6702/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
long long l,r,n,k;
int main()
{
cin>>n>>k;
long long ans=n*k;
for(l=1;l<=n;l=r+1)//l记录的是一段k/x相同的x的左端点,r是右端点,即当x属于[l,r]时,k/x的值保持相同
{
if(k/l==0)
break;
r=min(k/(k/l),n);//这里主要要和n取一个最小值,因为如果r大于n了就没有意义了,而且会对结果产生影响,会使结果变大
ans-=(k/l)*(l+r)*(r-l+1)/2;//(r-l+1)表示一段k/x值相同的x的个数,因为要减去的是对l<=i<=r,k/i*i的求和,因为我们这里是直接算的一段,这里后面成的i变成了l和r的中点,即(l+r)/2
//这里需要注意的一点是/2要放在最后,如果放在前面会导致答案不准确
}
printf("%lld\n", ans);
return 0;
}