1257: [CQOI2007]余数之和
Time Limit: 5 Sec Memory Limit: 128 MB
Submit: 6694 Solved: 3233
[Submit][Status][Discuss]
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^9Output
输出仅一行,即j(n, k)。
Sample Input
5 3
Sample Output
7
HINT
Source
请看:
公式:a%b== a-(a/b)*b;
一段上的 (n/i)相等 用数学表达式 就能算出边界的位置()
这个边界的求解 r=min(n,k/(k/l));
还可以理解为 k/l其实是 缩小的值 本应该是在 k/l,k/l+1之间的小数 我们找的那个边界希望是 所有里面 最靠近k/l的那个
分母越小值越大 那么直接用 k/(k/l) 得到就是最远的 并且 k/(k/(k/l))一定等于 k/l
ll n,k;
signed main() {
#ifdef local
freopen("input2.txt","r",stdin);
#endif //local
cin>>n>>k;
ll ans=n*k;
ll l=1,r=0;
for(;l<=n;l=r+1){
if(l<=k){
r=min(n,k/(k/l));
}else{
r=n;
}
ans-=(k/l)*(l+r)*(r-l+1)>>1;
}
cout<<ans<<en;
}