#include #include using namespace std; using i64 = int64_t; template vector MiddleProd(vector f, vector g) { int N = f.size(), M = g.size(); assert(N >= M); reverse(g.begin(), g.end()); vector h = atcoder::convolution(f, g); vector res(N - M + 1); for (int i = M - 1; i < N; ++i) { res[i - (M - 1)] = h[i]; } return res; } template vector MultiEvalGeomSeq(vector f, mint r, int M) { if (f.size() == 0) { vector res(M); return res; } int N = f.size(); auto calc = [&](mint q, int K) { // q^Tr(i) を計算 vector res(K, 1); mint nw = 1; for (int i = 1; i < K; ++i) { nw *= q; res[i] = res[i - 1] * nw; } return res; }; vector A = calc(r, N + M - 1), B = calc(mint(1) / r, max(N, M)); for (int i = 0; i < N; ++i) { f[i] *= B[i]; } auto g = MiddleProd(A, f); for (int i = 0; i < M; ++i) { g[i] *= B[i]; } return g; } template void AllInv(vector &f) { int n = f.size(); vector res(n + 1, 1); for (int i = 0; i < n; ++i) { res[i + 1] = res[i] * f[i]; } mint t = mint(1) / res[n]; res.pop_back(); for (int i = n - 1; i >= 0; --i) { res[i] *= t; t *= f[i]; } f = move(res); } void solve() { constexpr i64 P = 998244353, D = (1 << 13) * 119, E = (P - 1) / D; using mint = atcoder::static_modint

; i64 A, N; cin >> A >> N; i64 L = N / D, R = N % D; mint nw, nw2, cff; auto h = [&](int n) { i64 m = n / E; vector g(m); mint ee = mint(A).pow(E * E); nw = 1, cff = 1; for (i64 i = 0; i < m; ++i) { g[i] = nw; nw *= ee * cff; cff *= ee * ee; } auto W = MultiEvalGeomSeq(g, mint(A).pow(2 * E), E); vector res(E); nw = 1, cff = 1; for (i64 i = 0; i < E; ++i) { res[i] += nw * W[i]; nw *= A * cff; cff *= A * A; } nw = mint(A).pow(m * m * E * E), cff = mint(A).pow(2 * m * E); for (i64 i = m * E; i < n; ++i) { res[i % E] += nw; nw *= A * cff; cff *= A * A; } return res; }; vector X = h(D), Y = h(R); mint ans = 0, d2 = mint(A).pow(2 * D), ld2 = mint(A).pow(2 * L * D); nw = 1; vector Inv(E); for (i64 t = 0; t < E; ++t) { Inv[t] = -nw + 1; if (Inv[t] == 0) { Inv[t] = 1; } nw *= d2; } AllInv(Inv); nw = 1, nw2 = 1; for (i64 t = 0; t < E; ++t) { ans += (nw2 == mint(1) ? L : (-nw + 1) * Inv[t]) * X[t] + nw * Y[t]; nw *= ld2; nw2 *= d2; } cout << ans.val() << endl; } int main() { int T; cin >> T; while (T--) { solve(); } }