题意
Description
给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值
其中k mod i表示k除以i的余数。
例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7
Input
输入仅一行,包含两个整数n, k。
1<=n ,k<=10^9
Output
输出仅一行,即j(n, k)。
Sample Input
5 3
Sample Output
7
分析
\(k \bmod i = k - \lfloor \frac{k}{i} \rfloor * i\),这样的话要求的就是\(n*k-\sum_{i=1}^n \lfloor\frac ki\rfloor *i\)
这样的话整除分块就行了,时间复杂度\(O(\sqrt{k})\)
代码
#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
rg T data=0,w=1;
rg char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') w=-1;
ch=getchar();
}
while(isdigit(ch))
data=data*10+ch-'0',ch=getchar();
return data*w;
}
template<class T>il T read(rg T&x){
return x=read<T>();
}
typedef long long ll;
int main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
ll n,k,ans;
read(n),ans=n*read(k);
for(int x=1,gx;x<=n;x=gx+1){
gx=k/x?std::min(k/(k/x),n):n;
ans-=(k/x)*(x+gx)*(gx-x+1)/2;
}
printf("%lld\n",ans);
return 0;
}