ACwing 199 约数之和
题意:
给出正整数$n$和$k$,计算$k mod 1 + k mod 2 + k mod 3 + … + k mod n$的值。
思路:
已知$k mod n = k - k / n * n$,因此答案要求$n * k - k / 1 * 1 - k / 2 * 2 - ... - k / n * n$,用整数分块即可
Code:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; #define sd(a) scanf("%d", &a) #define sdd(a, b) scanf("%d%d", &a, &b) int n, k, en; ll ans; void solve(){ sdd(n, k); ans = (ll)n * k; for(int i = 1; i <= min(n, k); i = en + 1){ en = min(n, k / (k / i)); ll p = en - i + 1; ans -= k / i * (p * i + p * (p - 1) / 2); } printf("%lld\n", ans); } int main(){ int T = 1; // sd(T); while(T --){ solve(); } return 0; }