#include #include using namespace atcoder; #define rep(i, n) for (int i = 0; i < (n); ++i) using namespace std; using mint = modint998244353; vector isp; vector ps, pf, mu; void sieve(int mx) { isp.resize(mx+1); pf.resize(mx+1); mu.resize(mx+1); mu[1] = 1; rep(i, mx+1) pf[i] = i; for (int i = 2; i <= mx; ++i) { if (pf[i] == i) isp[i] = true, ps.push_back(i), mu[i] = -1; rep(j, ps.size()) { int x = ps[j]*i; if (x > mx) break; pf[x] = ps[j]; if (i%ps[j] == 0) { mu[i*ps[j]] = 0; break; } mu[i*ps[j]] = -mu[i]; } } } int main() { int n, m; cin >> n >> m; int l = min(n, m); sieve(l); mint ans; mint inv2 = mint(2).inv(); for (int d = 1; d <= l; ++d) { if (mu[d] == 0) continue; int x = n/d; int y = m/d; mint sx = mint(x)*(x+1)*inv2; mint sy = mint(y)*(y+1)*inv2; mint d2 = mint(d)*d; ans += mu[d]*d2*sx*sy; } cout << ans.val() << '\n'; return 0; }