由题可以列出式子
∑
i
n
k
%
i
=
∑
i
n
k
−
⌊
k
/
i
⌋
∗
i
=
n
∗
k
−
∑
i
n
⌊
k
/
i
⌋
∗
i
\sum_i^nk\%i=\sum_i^nk-\lfloor k/i\rfloor*i=n*k-\sum_i^n\lfloor k/i\rfloor*i
∑ink%i=∑ink−⌊k/i⌋∗i=n∗k−∑in⌊k/i⌋∗i
思路有点巧妙,其实可以分块来计算
怎么分块?
对于
⌊
k
i
⌋
\lfloor\frac{k}{i}\rfloor
⌊ik⌋的一定时,i是有范围的,在k/i!=0时,很容易得到i的最大值为
k
⌊
k
i
⌋
\frac{k}{\lfloor\frac{k}{i}\rfloor}
⌊ik⌋k 再将i进行跳跃即可
Code
#include<bits/stdc++.h>
#define re register
#define inl inline
#define int long long
using namespace std;
int read(){
int sum=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
while(isdigit(c)){sum=(sum<<3)+(sum<<1)+(c^48);c=getchar();}
return f*sum;
}
int n,k;
signed main(){
n=read(),k=read();
int ans=n*k;
for(int l=1,r;l<=n;l=r+1){
r= k/l==0 ? n : min(n,k/(k/l));
ans-=(l+r)*(k/l)*(r-l+1)/2;
}
printf("%lld",ans);
}