[BZOJ1257]余数之和

时间:2022-02-09 20:01:49

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

HINT

 

Source

把$a$%$b$表示成$a - \lfloor\frac{a}{b}\rfloor \cdot b$的形式

然后整除分块搞一波就行了

代码:

 #include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
ll k,n,ans;
int main()
{
cin>>n>>k;
if(n>k)
{
ans=(n-k)*k;
n=k;
}
for(ll r,l=;l<=n;l=r+)
{
r=k/(k/l);
if(r>n) r=n;
ans+=(r-l+)*k-(r-l+)*(l+r)/*(k/l);
}
cout<<ans;
return ;
}