本文共 1450 字,大约阅读时间需要 4 分钟。
要解决这个问题,我们需要计算双重求和:$\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{m} (n \bmod i) \times (m \bmod j)$,其中条件是$i \neq j$,然后对结果取模19940417。
#includeusing namespace std;const int mod = 19940417;ll solve(ll x) { ll ans = 0; ll p, i; for (i = 1, p = x; i <= p; i++) { p = x / i; if (i > p) break; ans = (ans - (p + i) * (p - i + 1) / 2 % mod) % mod; } return ans;}ll get(ll x) { return x * (x + 1) % mod; x = x % mod; x = x * (2 * x + 1) % mod; return x * inv % mod;}int main() { ios::sync_with_stdio(0); cin >> n >> m; ll sum_n = solve(n); ll sum_m = solve(m); ll total = (sum_n * sum_m) % mod; if (n > m) swap(n, m); for (ll i = 1; i <= n; i++) { ll p = min(n / i, m / i); if (i > p) continue; ll term1 = (m * n % mod) * (p - i + 1) % mod; ll term2 = (n / i) * (m / i) % mod; term2 = term2 * (get(p) - get(i - 1)) % mod; ll term3 = (p - i + 1) * (p + i) / 2 % mod; term3 = term3 * (n / i) % mod; term3 = term3 * (m % mod) % mod; term3 = term3 * (n % mod) % mod; total = (total - (term1 + term2 - term3) % mod) % mod; } cout << total % mod << endl;}
这个方法高效地处理了大数范围,确保了计算的可行性和效率。
转载地址:http://mdvfk.baihongyu.com/