Link
Solve
根据题目可以写出(ans=sumlimits_{i=1}^{n}k\%i)
根据 (a%b) 的定义可以得出可以表示为 (a-b*lfloorfrac{a}{b} floor)
(ans=sumlimits_{i=1}^{n}k-i*lfloorfrac{k}{i} floor=n*k-sumlimits_{i=1}^{n}i*lfloorfrac{k}{i} floor)
(lfloorfrac{k}{i} floor)的取值最多取到(2sqrt{n})个,就可以分块来处理,答案就是累加一个等差数列求和,总时间复杂度(O(sqrt{n}))
Code
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n,k,ans,t;
int main(){
scanf("%lld%lld",&n,&k);
for(int long long l=1,r;l<=n;l=r+1){
r=(t=k/l)?min(k/t,n):n;
ans-=t*(r-l+1)*(l+r)>>1;
}
printf("%lld",ans+n*k);
return 0;
}