#include #define ll long long using namespace std; const ll kM = 2e5 + 5, mod = 998244353; ll q, i, j, qt[kM], inv[kM], f[kM], len, p[kM]; ll qpow(ll a, ll b){ ll ret = 1; while(b){ if(b & 1) ret = ret * a % mod; a = a * a % mod, b >>= 1; } return ret; } struct M{ ll m, n, id; }c[kM]; ll C(ll n, ll m){ return f[n] * inv[m] % mod * inv[n - m] % mod; } ll wp(ll x){ return (x + len - 1) / len; } ll cmp(M a, M b){ if(wp(a.m) == wp(b.m)) return a.n < b.n; return a.m < b.m; } int main(){ ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); cin >> q; for(i = f[0] = p[0] = 1; i <= kM - 2; i++){ f[i] = f[i - 1] * i % mod; p[i] = p[i - 1] * 2 % mod; } inv[kM - 2] = qpow(f[kM - 2], mod - 2); for(i = kM - 3; ~i; i--){ inv[i] = inv[i + 1] * (i + 1) % mod; } len = 1.01 * sqrt(kM - 2) + 1; for(i = 1; i <= q; i++){ cin >> c[i].n >> c[i].m; c[i].id = i; } sort(c + 1, c + q + 1, cmp); ll cnt = 0, tmp = 0, l = 1, r = 0; for(i = 1; i <= q; i++){ ll m = c[i].m, n = c[i].n; if(wp(m) != wp(c[i - 1].m)){ cnt = p[n] - 1, tmp = 0; for(j = 0; j < m; j++){ tmp = (tmp + C(n - 1, j)) % mod; } l = m, r = n; } while(r < n) ++r, tmp = (tmp * 2 - C(r - 2, l - 1) + mod) % mod; while(l < m) l++, tmp = (tmp + C(r - 1, l - 1)) % mod; while(l > m) tmp = (tmp - C(r - 1, l - 1) + mod) % mod, l--; cnt = p[n] - 1; qt[c[i].id] = tmp * cnt % mod; } for(i = 1; i <= q; i++){ cout << qt[i] << "\n"; } return 0; }