#include #include using namespace std; using i32 = int; using u32 = unsigned int; using i64 = long long; using u64 = unsigned long long; #define FAST_IO \ ios::sync_with_stdio(false); \ cin.tie(0); const i64 INF = 1001001001001001001; using Modint = atcoder::static_modint<998244353>; int main() { FAST_IO int N, M; cin >> N >> M; // gcd(a, b) = 1 sum(ab) // d|gcd(a,b) sum(ab * sum(mu(d))) // d|a, d|b sum(ab * sum(mu(d))) vector mu(max(N, M) + 1, 1); mu[0] = 0; vector is_prime(N + 1, true); for (int i = 2; i <= N; i ++) { if (is_prime[i]) { if (1LL * i * i <= N) { for (int j = i * i; j <= N; j += i * i) { mu[j] = 0; } } for (int j = i; j <= N; j += i) { is_prime[j] = false; mu[j] *= -1; } } } Modint ans = 0; auto inv2 = Modint(2).inv(); for (int d = 1; d <= min(N, M); d ++) { i64 p = N / d; i64 q = M / d; // (d + 2d + ... + pd) * (d + ... + qd) auto ps = Modint(1) * d * p * (p + 1) * inv2; auto qs = Modint(1) * d * q * (q + 1) * inv2; ans += ps * qs * mu[d]; } cout << ans.val() << endl; }