#include using namespace std; #include using mint = atcoder::modint998244353; // https://drken1215.hatenablog.com/entry/2018/06/08/210000 const int MAX_V = 3000000; mint fac[MAX_V], finv[MAX_V], inv[MAX_V]; // テーブルを作る前処理 void COMinit() { const int MOD = mint::mod(); fac[0] = fac[1] = 1; finv[0] = finv[1] = 1; inv[1] = 1; for (int i = 2; i < MAX_V; ++i) { fac[i] = fac[i - 1] * i; inv[i] = MOD - inv[MOD % i] * (MOD / i); finv[i] = finv[i - 1] * inv[i]; } } // 二項係数計算 mint COM(int n, int r) { if (n < r) return 0; if (n < 0 || r < 0) return 0; return fac[n] * finv[r] * finv[n - r]; } int main() { COMinit(); int N, M; cin >> N >> M; // cumnoc[i] := スコアがi以上であるような場合の数 vector cumnoc(M + 1); for (int i = 0; i < M; ++i) { if (i * N > M) break; cumnoc[i] = COM(M - i * N + N, N); } // 1人でM点を取る場合を除外 if (N == 1) { for (int i = 0; i < M; ++i) { cumnoc[i] -= N; } } else { cumnoc[0] -= N; } // noc[i] := スコアがiであるような場合の数 vector noc(M); for (int i = 0; i < M; ++i) { noc[i] = cumnoc[i] - cumnoc[i + 1]; } mint ans = 0; for (int i = 0; i < M; ++i) { ans += i * noc[i]; } ans /= cumnoc[0]; cout << ans.val() << '\n'; return 0; }