#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 ps; vector comp(N + 1, 0); vector mu(N + 1, 1); for(int i = 2; i <= N; ++i) { if(!comp[i]) { ps.push_back(i); mu[i] = -1; } for(auto p : ps) { if(i * p > N) break; comp[i * p] = 1; if(i % p == 0) { mu[i * p] = 0; break; } mu[i * p] = -mu[i]; } } Modint ans = 0; Modint inv4 = Modint(4).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); auto qs = Modint(1) * d * q * (q + 1); ans += ps * qs * mu[d] * inv4; } cout << ans.val() << endl; }