#include <bits/stdc++.h>
using namespace std;
int H(int n){
int ans=0;
for(int i=1;i<=n;i=n/(n/i)+1){
int l=i,r=n/(n/i);
int len=r-l+1;
ans+=(n%l+n%r)*len/2;
}
return ans;
}
int main()
{
int n,k;
cin>>n>>k;
int sum=H(min(k,n));
for(int i=min(k,n)+1;i<=max(k,n);i++) sum+=i;
cout<<sum<<endl;
return 0;
}
请大家指点指点,思路就是,既然整除分块,那么就把所有块中的数的余数加起来,是个等差数列,所以就对n%l(l:块左端点)为首项,n%r(r:块右端点)为末项,公差为1的等差数列求和加进ans