#include #include #define mod 998244353 using namespace std; using ll = long long; const int maxn = 200010; int T; int d; int N = 1, M = 0, c = 1; ll res[maxn]; ll fact[maxn], ifact[maxn]; struct Q { int n, m; int id; } q[maxn]; bool cmp (Q x, Q y) { if (x.n / d == y.n / d) return x.m < y.m; return x.n < y.n; } ll P (ll x, ll y) { if (y == 0) return 1ll; ll t = P (x, y >> 1); if (y & 1) return t * t % mod * x % mod; return t * t % mod; } ll C (ll x, ll y) { return fact[x] * ifact[y] % mod * ifact[x - y] % mod; } void Addm () { c = (c + C (N, ++M)) % mod; } void Subm () { c = (c - C (N, M--) + mod) % mod; } void Addn () { c = ((c * 2 % mod - C (N++, M)) % mod + mod) % mod; } void Subn () { c = (c + C (--N, M)) % mod * P (2, mod - 2) % mod; } int main () { cin.tie (0)->sync_with_stdio (false); fact[0] = 1; for (int i = 1; i <= 200000; i++) fact[i] = fact[i - 1] * i % mod; for (int i = 0; i <= 200000; i++) ifact[i] = P (fact[i], mod - 2); cin >> T; d = 450; for (int i = 1; i <= T; i++) cin >> q[i].n >> q[i].m, q[i].id = i; sort (q + 1, q + T + 1, cmp); for (int i = 1; i <= T; i++) { res[q[i].id] = (P (2, q[i].n) - 1 + mod) % mod; q[i].n--; q[i].m--; } for (int i = 1; i <= T; i++) { while (N < q[i].n) Addn (); while (N > q[i].n) Subn (); while (M < q[i].m) Addm (); while (M > q[i].m) Subm (); res[q[i].id] = res[q[i].id] * c % mod; } for (int i = 1; i <= T; i++) { cout << res[i] << '\n'; } return 0; }