#include using namespace std; typedef long long ll; typedef pair pii; typedef pair pll; #define X first #define Y second #define SZ(a) ((int)a.size()) #define ALL(v) v.begin(), v.end() #define pb push_back const int MOD = 998244353; void add(int &x, int val) { x += val; if (x >= MOD) x -= MOD; } struct Matrix { int n, m, M[2][2]; Matrix(int _n = 0, int _m = 0): n(_n), m(_m) { for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) M[i][j] = 0; } Matrix operator*(const Matrix &a) const { Matrix res(n, a.m); for (int i = 0; i < res.n; ++i) for (int j = 0; j < res.m; ++j) for (int k = 0; k < m; ++k) add(res.M[i][j], (ll)M[i][k] * a.M[k][j] % MOD); return res; } }; const int MAXN = 10000005; int dp[MAXN + 5][2], tot[MAXN + 5]; void solve() { ll n, m; cin >> n >> m, ++n, ++m; if (n > m) swap(n, m); if (n == 1) { cout << 1 << "\n"; return; } /*auto r = [&](ll idx) { return min({idx + 1, n + m - 1 - idx, n}); }; for (int i = 0; i <= n + m - 2; ++i) { sum[i][0] = sum[i][1] = 0; int v = 0; if (i == 0) v = 1; if (i >= 1) add(v, sum[i - 1][0]); if (i >= 2) add(v, sum[i - 2][1]); if (i == n + m - 2) { cout << v << "\n"; break; } add(sum[i][0], (ll)v * (r(i) - int(r(i) > r(i + 1))) % MOD); add(sum[i][0], (ll)v * (r(i) - int(r(i) >= r(i + 1))) % MOD); add(sum[i][1], (ll)v * (r(i) - int(r(i) >= r(i + 1)) - int(r(i) > r(i + 1))) % MOD); }*/ Matrix base(1, 2); // r(i - 1) < r(i): [0, n) base.M[0][0] = tot[n]; base.M[0][1] = tot[n - 1]; // r(i - 1) == r(i): [n, m) { Matrix tr(2, 2); tr.M[0][0] = 2 * n - 1; tr.M[1][0] = n - 1; tr.M[0][1] = 1; for (ll x = m - n; x; x >>= 1, tr = tr * tr) if (x & 1) base = base * tr; } // r(i - 1) > r(i): [m, n+m-1) int ans = 0; add(ans, (ll)base.M[0][0] * (2 * n - 2) % MOD * tot[n - 1] % MOD); add(ans, (ll)base.M[0][0] * (n - 2) % MOD * tot[n - 2] % MOD); add(ans, (ll)base.M[0][1] * (n - 1) % MOD * tot[n - 1] % MOD); cout << ans << "\n"; } int main() { ios::sync_with_stdio(0), cin.tie(0); for (int i = 1; i <= MAXN; ++i) { dp[i][0] = dp[i][1] = 0; tot[i] = 0; if (i == 1) tot[i] = 1; if (i > 1) add(tot[i], dp[i - 1][0]); if (i > 2) add(tot[i], dp[i - 2][1]); dp[i][0] = (ll)tot[i] * i * 2 % MOD; dp[i][1] = (ll)tot[i] * i % MOD; } int t; cin >> t; while (t--) { solve(); } }