题解 P2261 【[CQOI2007]余数求和】
前置知识:整除分块
整除分块就是:
这道题让我们求
这个式子可以写成这样
我们知道对于每一个整除分块
中的值都是一样的,所以我们可以设
这个式子就变成了
至此,我们可以在
#include <cstdio>
#define int long long
template < typename T>
inline T getmin(T x, T y) { return x > y ? y : x; }
signed main() {
long long n, k, ans = 0;
scanf("%lld %lld", &n, &k);
for (long long l = 1, r = 0, t; l <= n; l = r + 1) r = (t = k / l) ? getmin(k / t, n) : n, ans -= t * (r - l + 1) * (l + r) >> 1;
printf("%lld\n", ans = ans + n * k);
}