use ac_library::ModInt998244353; use proconio::input; fn solve() -> ModInt998244353 { input! { n: usize, m: usize, } let mx = n.max(m); let mu = mu(mx); let mut ans = ModInt998244353::raw(0); for g in 1..=mx { ans += f(n / g, m / g, &mu) * g; } ans } fn f(n: usize, m: usize, mu: &[i8]) -> ModInt998244353 { let mut res = ModInt998244353::raw(0); let mx = n.max(m); for d in 1..=mx { let a = (n / d) as i64; let b = (m / d) as i64; let mut x = ModInt998244353::new(mu[d]) * d * d; x *= a * (a + 1) / 2; x *= b * (b + 1) / 2; res += x; } res } fn main() { let ans = solve(); println!("{}", ans); } fn mu(n: usize) -> Vec { let mut t = vec![1; n + 1]; t[0] = 0; let mut p = vec![true; n + 1]; p[0] = false; p[1] = false; for k in 2..=n { if p[k] { for i in 1.. { let ki = k.saturating_mul(i); if ki > n { break; } p[ki] = false; t[ki] *= -1; let kki = ki.saturating_mul(k); if kki > n { continue; } t[kki] = 0; } } } t }