#include <bits/stdc++.h>   using namespace std;   using ll = long long;   using uint = unsigned int;   template <class T>   using V = vector<T>;   template <class T>   using VV = vector<vector<T>>;   template <class T, class U>   void chmax(T& x, U y) {     if (x < y) x = y;   }   template <class T, class U>   void chmin(T& x, U y) {     if (y < x) x = y;   }   template <class T>   void mkuni(V<T>& v) {     sort(v.begin(), v.end());     v.erase(unique(v.begin(), v.end()), v.end());   }   template <class S, class T>   ostream& operator<<(ostream& o, const pair<S, T>& p) {     return o <<  (  << p.first <<  ,  << p.second <<  ) ;   }   template <class T>   ostream& operator<<(ostream& o, const vector<T>& vc) {     o <<  { ;     for (const T& v : vc) o << v <<  , ;     o <<  } ;     return o;   }   constexpr ll TEN(int n) { return (n == 0) ? 1 : 10 * TEN(n - 1); }   template <unsigned int mod_>   struct ModInt {     using uint = unsigned int;     using ll = long long;     using ull = unsigned long long;     constexpr static uint mod = mod_;     uint v;     ModInt() : v(0) {}     ModInt(ll _v) : v(normS(_v % mod + mod)) {}     explicit operator bool() const { return v != 0; }     static uint normS(const uint& x) { return (x < mod) ? x : x - mod; }     static ModInt make(const uint& x) {       ModInt m;       m.v = x;       return m;     }     ModInt operator+(const ModInt& b) const { return make(normS(v + b.v)); }     ModInt operator-(const ModInt& b) const { return make(normS(v + mod - b.v)); }     ModInt operator-() const { return make(normS(mod - v)); }     ModInt operator*(const ModInt& b) const { return make((ull)v * b.v % mod); }     ModInt operator/(const ModInt& b) const { return *this * b.inv(); }     ModInt& operator+=(const ModInt& b) { return *this = *this + b; }     ModInt& operator-=(const ModInt& b) { return *this = *this - b; }     ModInt& operator*=(const ModInt& b) { return *this = *this * b; }     ModInt& operator/=(const ModInt& b) { return *this = *this / b; }     ModInt& operator++(int) { return *this = *this + 1; }     ModInt& operator--(int) { return *this = *this - 1; }     ll extgcd(ll a, ll b, ll& x, ll& y) const {       ll p[] = {a, 1, 0}, q[] = {b, 0, 1};       while (*q) {         ll t = *p / *q;         for (int i = 0; i < int(3); i++) swap(p[i] -= t * q[i], q[i]);       }       if (p[0] < 0)         for (int i = 0; i < int(3); i++) p[i] = -p[i];       x = p[1], y = p[2];       return p[0];     }     ModInt inv() const {       ll x, y;       extgcd(v, mod, x, y);       return make(normS(x + mod));     }     ModInt pow(ll p) const {       if (p < 0) return inv().pow(-p);       ModInt a = 1;       ModInt x = *this;       while (p) {         if (p & 1) a *= x;         x *= x;         p >>= 1;       }       return a;     }     bool operator==(const ModInt& b) const { return v == b.v; }     bool operator!=(const ModInt& b) const { return v != b.v; }     friend istream& operator>>(istream& o, ModInt& x) {       ll tmp;       o >> tmp;       x = ModInt(tmp);       return o;     }     friend ostream& operator<<(ostream& o, const ModInt& x) { return o << x.v; }   };   using mint = ModInt<998244353>;   V<mint> fact, ifact;   mint Choose(int a, int b) {     if (b < 0 || a < b) return 0;     return fact[a] * ifact[b] * ifact[a - b];   }   void InitFact(int N) {     fact.resize(N);     ifact.resize(N);     fact[0] = 1;     for (int i = 1; i <= int(N - 1); i++) fact[i] = fact[i - 1] * i;     ifact[N - 1] = fact[N - 1].inv();     for (int i = N - 2; i >= 0; i--) ifact[i] = ifact[i + 1] * (i + 1);   }   void test() {     int N, M;     cin >> N >> M;     V<mint> f(N + 1);     for (int x = int(N) - 1; x >= 0; x--) {       void(0);       mint sum_pi = 0;       V<mint> p(N - x + 1), q(N - x + 1);       for (int i = 0; i < int(N - x + 1); i++) {         mint pi = 0;         mint qi = 0;         for (int j = 0; j < int(x + 1); j++) {           mint pij = ifact[N + M] * fact[N + M - (i + j) - 1] * M * fact[i + j] *                      Choose(N - x, i) * Choose(x, j);           pi += pij;           qi += pij * (i + j + 1);         }         p[i] = pi, q[i] = qi;         void(0);         void(0);         void(0);         sum_pi += pi;       }       {         mint sum = 0;         for (int i = 0; i < int(N - x + 1); i++) {           sum += q[i];           if (i) sum += p[i] * f[x + i];         }         f[x] = sum / (mint(1) - p[0]);       }       assert(sum_pi == 1);     }     V<mint> df(N);     for (int i = 0; i < int(N); i++) df[i] = f[i] - f[i + 1];     reverse(df.begin(), df.end());     for (int i = int(N) - 1; i >= 0; i--) df[i] /= df[0];     cout << df << endl;   }   int main() {     cin.tie(0);     ios::sync_with_stdio(false);     cout << fixed << setprecision(20);     InitFact(3000000);     int N, M;     cin >> N >> M;     mint ans = 0;     for (int i = 0; i < int(N); i++) {       if (i == 0)         ans += mint(M).inv();       else         ans += (mint(M + 1) * (i + 1)).inv();     }     ans *= M;     ans *= N + M + 1;     cout << ans << endl;   }