# input import sys input = sys.stdin.readline II = lambda : int(input()) MI = lambda : map(int, input().split()) LI = lambda : [int(a) for a in input().split()] SI = lambda : input().rstrip() LLI = lambda n : [[int(a) for a in input().split()] for _ in range(n)] LSI = lambda n : [input().rstrip() for _ in range(n)] MI_1 = lambda : map(lambda x:int(x)-1, input().split()) LI_1 = lambda : [int(a)-1 for a in input().split()] mod = 998244353 inf = 1001001001001001001 ordalp = lambda s : ord(s)-65 if s.isupper() else ord(s)-97 ordallalp = lambda s : ord(s)-39 if s.isupper() else ord(s)-97 yes = lambda : print("Yes") no = lambda : print("No") yn = lambda flag : print("Yes" if flag else "No") prinf = lambda ans : print(ans if ans < 1000001001001001001 else -1) alplow = "abcdefghijklmnopqrstuvwxyz" alpup = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" alpall = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" URDL = {'U':(-1,0), 'R':(0,1), 'D':(1,0), 'L':(0,-1)} DIR_4 = [[-1,0],[0,1],[1,0],[0,-1]] DIR_8 = [[-1,0],[-1,1],[0,1],[1,1],[1,0],[1,-1],[0,-1],[-1,-1]] DIR_BISHOP = [[-1,1],[1,1],[1,-1],[-1,-1]] prime60 = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59] sys.set_int_max_str_digits(0) # sys.setrecursionlimit(10**6) # import pypyjit # pypyjit.set_param('max_unroll_recursion=-1') from collections import defaultdict,deque from heapq import heappop,heappush from bisect import bisect_left,bisect_right DD = defaultdict BSL = bisect_left BSR = bisect_right class Comb: __slots__ = ["fac", "finv", "mod"] def __init__(self, lim:int, mod:int = mod): """ mod : prime """ self.fac = [1]*(lim+1) self.finv = [1]*(lim+1) self.mod = mod for i in range(2,lim+1): self.fac[i] = self.fac[i-1]*i%self.mod self.finv[lim] = pow(self.fac[lim],-1,mod) for i in range(lim,2,-1): self.finv[i-1] = self.finv[i]*i%self.mod def C(self, a, b): if b < 0 or a < b: return 0 if a < 0: return 0 return self.fac[a]*self.finv[b]%self.mod*self.finv[a-b]%self.mod def __call__(self, a, b): if b < 0 or a < b: return 0 if a < 0: return 0 return self.fac[a]*self.finv[b]%self.mod*self.finv[a-b]%self.mod def P(self, a, b): if b < 0 or a < b: return 0 if a < 0: return 0 return self.fac[a]*self.finv[a-b]%self.mod def M(self, *k): n = sum(k) if n < 0: return 0 res = self.fac[n] for ki in k: if ki < 0: return 0 res = res * self.finv[ki] % self.mod return res def H(self, a, b): return self.C(a+b-1,b) def F(self, a): return self.fac[a] def Fi(self, a): return self.finv[a] def prime_enumerate(lim:int, get:int = 0) -> list[int]: """ get = 0 : enumerate get = 1 : flag """ lim += 1 prime_flag = [1]*lim prime_enu = [] prime_flag[0] = 0 prime_flag[1] = 0 for p in range(2,lim): if prime_flag[p]: prime_enu.append(p) for q in range(2*p,lim,p): prime_flag[q] = 0 if get == 0: return prime_enu else: return prime_flag mod = 998244353 def mat_add(a, b): # assert len(a) == len(b) # assert len(a[0]) == len(b[0]) n = len(a) m = len(a[0]) res = [[0]*m for i in range(n)] for i in range(n): for j in range(m): res[i][j] = (a[i][j] + b[i][j])%mod return res def mat_sub(a, b): # assert len(a) == len(b) # assert len(a[0]) == len(b[0]) n = len(a) m = len(a[0]) res = [[0]*m for i in range(n)] for i in range(n): for j in range(m): res[i][j] = (a[i][j] - b[i][j])%mod return res def mat_mul(a, b): # assert len(a[0]) == len(b) n = len(a) m = len(b[0]) res = [[0]*m for i in range(n)] for i,r_i in enumerate(res): for k,a_ik in enumerate(a[i]): for j,b_kj in enumerate(b[k]): r_i[j] = (r_i[j] + a_ik*b_kj)%mod return res def mat_pow2(a): n = len(a) res = [[0]*n for i in range(n)] for i,r_i in enumerate(res): for k,a_ik in enumerate(a[i]): for j,a_kj in enumerate(a[k]): r_i[j] = (r_i[j] + a_ik*a_kj)%mod return res def mat_inv(a, mod = mod): """いつか実装します""" pass def mat_pow(a, exp): n = len(a) res = [[int(i == j) for j in range(n)] for i in range(n)] d = exp.bit_length() for i in range(d, -1, -1): if (exp >> i) & 1: res = mat_mul(res, a) if i == 0: return res res = mat_pow2(res) ps = prime_enumerate(10 ** 7 + 1) comb = Comb(10 ** 7 + 1) # ^ 2 素数の数え上げ ok = [] for i in range(len(ps) - 1): if ps[i]^2 == ps[i+1]: ok.append(ps[i+1]) def solve(): n, m = MI() if n == 1: print(bisect_right(ps, m)) return c = bisect_right(ok, m) # p -> 2 or m = [[0, 1], [2 * c, 1]] r = mat_pow(m, n - 1) ans = r[0][0] + r[1][0] + (r[0][1] + r[1][1]) * (2 * c) print(ans % mod) t = II() for i in range(t): solve()