#include #include #include using namespace std; using ll = long long; using pii = pair; const int kN = 2e5 + 1, kM = 998244353; int n, m, q, s[kN], f[kN], inv[kN], ans[kN]; struct Query { int n, k, d, id; bool operator<(const Query x) const { return d == x.d ? k < x.k : d < x.d; } } qe[kN]; int Pow(int x, int y) { int res = 1; for (; y; y >>= 1, x = 1ll * x * x % kM) (y & 1) && (res = 1ll * res * x % kM); return res; } int C(int n, int m) { if (n < m) return 0; return 1ll * f[n] * inv[m] % kM * inv[n - m] % kM; } int main() { #ifndef ONLINE_JUDGE freopen("in", "r", stdin); freopen("out", "w", stdout); #endif cin.tie(0)->sync_with_stdio(0); s[0] = f[0] = 1; for (int i = 1, p = 1; i < kN; i++) p = 2ll * p % kM, s[i] = (1ll * s[i - 1] + p) % kM, f[i] = 1ll * f[i - 1] * i % kM; inv[kN - 1] = Pow(f[kN - 1], kM - 2); for (int i = kN - 1; i >= 1; i--) inv[i - 1] = 1ll * inv[i] * i % kM; cin >> q, m = ceil(2e5 / sqrt(q)); for (int i = 1; i <= q; i++) cin >> qe[i].n >> qe[i].k, qe[i].n--, qe[i].k--, qe[i].id = i, qe[i].d = qe[i].n / m; sort(qe + 1, qe + q + 1); for (int i = 1, n = 0, k = 0, res = 1; i <= q; i++) { for (; n < qe[i].n; n++) res = (2ll * res % kM - C(n, k) + kM) % kM; for (; n > qe[i].n; n--) res = (1ll * res + C(n - 1, k)) % kM * inv[2] % kM; for (; k < qe[i].k; k++) res = (1ll * res + C(n, k + 1)) % kM; for (; k > qe[i].k; k--) res = (1ll * res - C(n, k) + kM) % kM; ans[qe[i].id] = 1ll * res * s[n] % kM; } for (int i = 1; i <= q; i++) cout << ans[i] << '\n'; return 0; }