余数之和
题目链接:ybt高效进阶6-2-5
题目大意
给你 n,k,要你计算 k mod 1 + k mod 2 + … + k mod n。
思路
首先我们考虑
m
o
d
\bmod
mod 这个东西。
x
m
o
d
y
=
x
−
⌊
x
y
⌋
∗
y
x\bmod y=x-\left\lfloor \dfrac{x}{y}\right\rfloor*y
xmody=x−⌊yx⌋∗y
那我们考虑全部加载一起,两项分开,变成求:
n
k
−
∑
i
=
1
n
⌊
k
i
⌋
∗
i
nk-\sum\limits_{i=1}^n\left\lfloor \dfrac{k}{i}\right\rfloor*i
nk−i=1∑n⌊ik⌋∗i
发现右边可以整除分块,就加上一个快速求等差序列和就可以过了。
代码
#include<cstdio>
#define ll long long
using namespace std;
ll n, k, ans, r;
int main() {
scanf("%lld %lld", &n, &k);
ans = n * k;
for (int l = 1; l <= k && l <= n; l = r + 1) {
r = k / (k / l);//整除分块
if (r > n) r = n;
ans -= (k / l) * (l + r) * (r - l + 1) / 2;
}
printf("%lld", ans);
return 0;
}