#include #include using namespace atcoder; #define rep(i, n) for (int i = 0; i < (n); ++i) using namespace std; using mint = modint998244353; vector ps, pf; vector g; void sieve(int mx) { pf.resize(mx+1); g.resize(mx+1); g[1] = 1; rep(i, mx+1) pf[i] = i; for (int i = 2; i <= mx; ++i) { if (pf[i] == i) { ps.push_back(i); g[i] = mint(i)*(1-i); } rep(j, ps.size()) { int x = ps[j]*i; if (x > mx) break; pf[x] = ps[j]; if (i%ps[j] == 0) { g[x] = g[i]*ps[j]; break; } g[x] = g[i]*g[ps[j]]; } } } int main() { int n, m; cin >> n >> m; int L = min(n, m); sieve(L); vector s(L+1); for (int i = 1; i <= L; ++i) { s[i] = s[i-1] + g[i]; } auto f = [](int x) { return mint(x)*(x+1)/2; }; mint ans; for (int l = 1, r; l <= L; l = r+1) { r = min(n/(n/l), m/(m/l)); mint ng = s[r]-s[l-1]; ans += ng*f(n/l)*f(m/l); } cout << ans.val() << '\n'; return 0; }