题解
2025-07-13 20:02:24
发布于:浙江
2阅读
0回复
0点赞
#include<bits/stdc++.h>
#define int __int128 // 使用 __int128 防止中间过程溢出
using namespace std;
int n, k;
int ans;
signed main() {
scanf("%lld%lld", &n, &k); // 输入 n 和 k
// 分块计算 ∑(k mod i) = n*k - ∑(i=1~n) floor(k/i)*i
for (long long l = 1, r, t; l <= n; l = r + 1) {
t = k / l; // 当前商值:floor(k / i), 若商为 0,则余数恒为 k,自然后续都为 k mod i = k,终止在 r = n
r = (t ? min(k / t, n) : n); // 计算当前商值 t 可覆盖的右端 r
ans -= t * (r - l + 1) * (l + r) >> 1;
}
// 累加得到最终答案 ∑(k mod i)
ans += n * k;
// __int128 有时无法直接用 printf 输出,需注意
printf("%lld", ans);
return 0;
}
这里空空如也
有帮助,赞一个