// SPDX-License-Identifier: CC0 #include #include #include #include #include using namespace std; using mint = atcoder::modint998244353; int main() { cin.tie(nullptr); ios_base::sync_with_stdio(false); int n, m; cin >> n >> m; // $$ f_t(x) = \sum_{i=0}^{2^t} (\text{暖色先頭で暖色が $i$ 人含まれる列の総数}) x^i $$ auto f = vector>(n + 1); // $$ f_0(x) = x $$ f[0] = vector{0, 1}; for (auto t : views::iota(0, n)) { // $$ f_{t+1}(x) = (f_t(x))^2 + f_t(x) $$ f[t + 1] = atcoder::convolution(f[t], f[t]); for (auto i : views::iota(0, ssize(f[t]))) { f[t + 1][i] += f[t][i]; } } // $$ ([x^{2^n - m}](f_n(x) + 1)) m! (2^n - m)! $$ auto ans = f[n][(1 << n) - m]; if (m == 1 << n) ans += 1; for (auto i : views::iota(1, m + 1)) { ans *= i; } for (auto i : views::iota(1, (1 << n) - m + 1)) { ans *= i; } cout << ans.val() << "\n"; }