#include #include #include #include #include using mint = atcoder::modint998244353; using fps = std::vector; fps fps_inv(const fps& f) { int n = f.size(); fps f_fft, g_fft; fps g{ f[0].inv() }; for (int k = 1; k < n; k *= 2) { f_fft = fps(f.begin(), f.begin() + std::min(2 * k, n)); g_fft = g; f_fft.resize(2 * k), g_fft.resize(2 * k); atcoder::internal::butterfly(f_fft); atcoder::internal::butterfly(g_fft); fps fg(2 * k); for (int i = 0; i < 2 * k; ++i) fg[i] = f_fft[i] * g_fft[i]; atcoder::internal::butterfly_inv(fg); fg.erase(fg.begin(), fg.begin() + k), fg.resize(2 * k); atcoder::internal::butterfly(fg); for (int i = 0; i < 2 * k; ++i) fg[i] *= g_fft[i]; atcoder::internal::butterfly_inv(fg); const mint iz = mint(2 * k).inv(), c = -iz * iz; g.resize(2 * k); for (int i = 0; i < k; ++i) g[k + i] = fg[i] * c; } g.resize(n); return g; } int main() { int n; long long m; std::cin >> n >> m; fps f(n + 1); f[1] = 1; for (int i = 2; i <= n; ++i) f[i] += f[i - 1] - f[i - 2]; for (int i = 1; i <= n; ++i) f[i] *= std::max(0LL, m - i + 1); f[0] = 1; for (int i = 1; i <= n; ++i) f[i] = -f[i]; std::cout << fps_inv(f)[n].val() << std::endl; }