记录编号 |
571093 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[清华集训 2012] 模积和 |
最终得分 |
100 |
用户昵称 |
lihaoze |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.002 s |
提交时间 |
2022-05-07 10:39:52 |
内存使用 |
1.18 MiB |
显示代码纯文本
#include <bits/stdc++.h>
#define OPEN(_x) freopen(#_x".in", "r", stdin); freopen(#_x".out", "w", stdout)
#define rep(_x, _y, _z) for (int _x = (_y); _x <= (_z); ++ _x)
using i64 = long long;
const i64 MOD = 19940417;
const i64 inv2 = 9970209, inv6 = 3323403;
i64 s(i64 l, i64 r) { return (r * (r + 1) % MOD - l * (l - 1) % MOD) % MOD * inv2 % MOD; }
i64 S(i64 n) { return n * (n + 1) % MOD * (n + n + 1) % MOD * inv6 % MOD; }
i64 C(i64 n, i64 k) {
i64 res = 0, l = 1, r;
while (l <= n) {
r = std::min(k / (k / l), n);
res = (res + (k / l) * s(l, r) % MOD) % MOD;
l = r + 1;
}
return res % MOD;
}
i64 C_2(i64 n, i64 k1, i64 k2) {
i64 res = 0, l = 1, r;
while (l <= n) {
r = std::min(k1 / (k1 / l), k2 / (k2 / l));
res = (res + (k1 / l) * (k2 / l) % MOD * (S(r) - S(l - 1))) % MOD;
l = r + 1;
}
return res % MOD;
}
i64 f(i64 n) { return (n * n - C(n, n)) % MOD; }
i64 n, m;
i64 res;
int main() {
OPEN(modmuladd);
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin >> n >> m;
if (n > m) std::swap(n, m);
res = f(n) * f(m) % MOD;
res = (res + n * C(n, m) + m * C(n, n)) % MOD;
res = (res - n * n % MOD * m) % MOD;
res = (res - C_2(n, n, m)) % MOD;
std::cout << (res % MOD + MOD) % MOD << '\n';
return 0;
}