题意
题解
取模运算可以写为
k
m
o
d
i
=
k
−
⌊
k
/
i
⌋
×
i
k\ mod\ i = k-\lfloor k/i\rfloor\times i
k mod i=k−⌊k/i⌋×i,那么有
G
(
n
,
k
)
=
∑
i
=
1
n
(
k
−
⌊
k
/
i
⌋
×
i
)
=
n
k
−
∑
i
=
1
n
(
⌊
k
/
i
⌋
×
i
)
G(n,k)=\sum\limits_{i=1}^{n}(k-\lfloor k/i\rfloor\times i)=nk-\sum\limits_{i=1}^{n}(\lfloor k/i\rfloor\times i)
G(n,k)=i=1∑n(k−⌊k/i⌋×i)=nk−i=1∑n(⌊k/i⌋×i) 此时就可以使用整除分块
O
(
k
)
O(\sqrt k)
O(k) 求解。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll n, k, res;
scanf("%lld%lld", &n, &k);
res = n * k;
for (int i = 1, last; i <= n; i = last + 1)
{
ll x = k / i;
last = x ? min(k / x, n) : n;
res -= x * (i + last) * (last - i + 1) / 2;
}
printf("%lld\n", res);
return 0;
}