#include using namespace std; static const int MOD = 998244353; // 階乗テーブルと逆元テーブル vector fact, ifact; // a^b mod M (b が省略されていれば逆元計算) long long modpow(long long a, long long b = MOD-2) { long long r = 1; while (b) { if (b & 1) r = r * a % MOD; a = a * a % MOD; b >>= 1; } return r; } // nCk mod long long C(int n, int k) { if (k < 0 || k > n) return 0; return fact[n] * ifact[k] % MOD * ifact[n-k] % MOD; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N, K; cin >> N >> K; // 1) 階乗・逆階乗の前計算 (0 ≤ i ≤ 2N) fact.assign(2*N+1, 1); for(int i = 1; i <= 2*N; i++) fact[i] = fact[i-1] * i % MOD; ifact.assign(2*N+1, 1); ifact[2*N] = modpow(fact[2*N]); for(int i = 2*N; i > 0; i--) ifact[i-1] = ifact[i] * i % MOD; // 2) 全通り = C(2N, N) long long total = C(2*N, N); // 3) bad = 範囲 (max−min) ≤ K−1 の「橋」の数を反射法で数え上げ int M = K - 1; int D = M + 1; // 反射の幅 int limit = (2*N) / D + 2; // ±limit まで走れば十分(範囲外は C()=0) long long bad = 0; for(int r = -limit; r <= limit; r++){ long long t = C(2*N, N + r * D); // r の偶奇で交互に足し引き if (r & 1) bad = (bad - t) % MOD; else bad = (bad + t) % MOD; } if (bad < 0) bad += MOD; // 4) 答え = total − bad long long ans = (total - bad) % MOD; if (ans < 0) ans += MOD; cout << ans << "\n"; return 0; }