题解
[ans=sum_{i=1}^nk mod i=sum_{i=1}^{n}k-lfloor k/i
floor*i=n*k-sum_{i=1}^nlfloor k/i
floor *i
]
其中 (sum_{i=1}^nlfloor k/i floor *i) 可以用整除分块在 (O(sqrt{k})) 的时间复杂度内求出来。
代码
int n,k;
LL ans;
int main(){
scanf("%d%d",&n,&k);
ans=1ll*n*k;
for(int l=1,r;l<=min(n,k);l=r+1){
r=min(k/(k/l),n);
ans-=1ll*(l+r)*(r-l+1)/2*(k/l);
}
printf("%lld
",ans);
return 0;
}