// Gemini 3 Thinking #include #include #include #include using namespace std; using namespace atcoder; using mint = modint998244353; int main() { int N, M; cin >> N >> M; if (N == 0) { cout << 1 << endl; return 0; } // 指数型生成関数の係数を管理するベクトル // f_n は暖色を先頭とする有効な並び方の数 / (m! * (2^n-m)!) を保持します vector f = {1}; for (int t = 0; t < N; ++t) { // g_{t} は x^(2^t) なので、f_{t} * (f_{t} + x^(2^t)) を計算します vector f_plus_g = f; f_plus_g.push_back(1); // x^(2^t) の項を加算 f = convolution(f, f_plus_g); // f の次数は常に 2^(t+1) - 1 になります } // 最終的な答えを抽出 // [x^M] (f_N + g_N) * M! * (2^N - M)! を計算します mint ans_coeff; int total_people = 1 << N; if (M < total_people) { ans_coeff = f[M]; } else { ans_coeff = 1; // g_N = x^(2^N) の係数 } // 階乗の計算 vector fact(total_people + 1, 1); for (int i = 2; i <= total_people; ++i) { fact[i] = fact[i - 1] * i; } mint result = ans_coeff * fact[M] * fact[total_people - M]; cout << result.val() << endl; return 0; }