#include using namespace std; using i64 = long long; const int N = 1e5 + 10, P = 998244353; bool square(i64 x) { i64 r = sqrt(x); return r * r == x || (r - 1) * (r - 1) == x || (r + 1) * (r + 1) == x; } i64 mysqrt(i64 x) { i64 ret = sqrt(x); while(ret * ret < x) ret ++; while(ret * ret > x) ret --; return ret; } int inv[N], fact[N], invFact[N]; int C(int n, int m) {if(m < 0 || m > n) return 0; return fact[n] * (i64)invFact[m] % P * invFact[n - m] % P;} int solve() { i64 n, k; cin >> n >> k; n ++; i64 delta = n * n - 4 * k; //cout << "delta = " << delta << " "; if(delta < 0 || !square(delta)) return 0; delta = mysqrt(delta); if((n ^ delta) & 1) return 0; i64 ret = C(n - 1, (n + delta) / 2); if(delta) (ret += C(n - 1, (n - delta) / 2)) %= P; return ret; /* (a + b) = n; (a * b) = k; a = n - b; b * (n - b) = k; -b2 + nb - k = 0 n*n - 4k -2 -b */ } int main() { ios::sync_with_stdio(false); cin.tie(0); fact[0] = invFact[0] = inv[1] = fact[1] = invFact[1] = 1; for(int i = 2; i < N; i ++) { fact[i] = fact[i - 1] * (i64)i % P; inv[i] = (P - P / i) * (i64)inv[P % i] % P; invFact[i] = invFact[i - 1] * (i64)inv[i] % P; } int T; cin >> T; while(T --) cout << solve() << "\n"; }