Solution:
一波转化:
[sum^n_{i=1}k mod i=sum^n_{i=1}k-i*leftlfloor {k/i}
ight
floor
=n*k-sum^n_{i=1}i*leftlfloor {k/i}
ight
floor
]
然后可以发现右边那个式子中的 k/i 在i取一定范围内的数时,它的值是一定的。
所以可以利用这个性质,直接枚举每一段相等的左右端点即可。
Code:
#include <bits/stdc++.h>
#define RG register
#define IL inline
#define int long long
using namespace std;
IL int gi(){
char ch=getchar(); int x=0,q=0;
while(ch<'0'||ch>'9') q=ch=='-'?1:q,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return q?-x:x;
}
int n,k,ans;
signed main() {
RG int i,j;
n=gi(),k=gi(),ans=n*k;
for (i=1;i<=n&&(k/i);i=j+1) {
j=min(k/(k/i),n);
ans-=(k/i)*(i+j)*(j-i+1)/2;
}
printf("%lld
",ans);
return 0;
}