除法分块模板&洛谷

余数求和(数学题)
题目描述
给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数。例如G(10, 5)=5 mod 1 + 5 mod 2 + 5 mod 3 + 5 mod 4 + 5 mod 5 …… + 5 mod 10=0+1+2+1+0+5+5+5+5+5=29

input

10 5

output

29

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n, k;
cin >> n >> k;
long long ans = n * k;
for(long long l = 1, r; l <= n; l = r+1) {
if(k / l == 0)//如果小于1则直接最后一段等于右端点区间
r = n;
else {//不然就讨论右边端点的大小
r = min(n, k/(k/l));
}
ans -= (k/l)*(r-l+1)*(l+r) / 2;
}
cout << ans << endl;

return 0;
}