from collections import deque, defaultdict, Counter from bisect import bisect_left, bisect_right from itertools import permutations, combinations, groupby from heapq import heappop, heappush import math, sys input = lambda: sys.stdin.readline().rstrip("\r\n") def printl(li, sep=" "): print(sep.join(map(str, li))) def yn(flag): print(Yes if flag else No) _int = lambda x: int(x)-1 MOD = 998244353 #10**9+7 INF = 1<<60 Yes, No = "Yes", "No" class MatrixPow: def __init__(self, add, zero, mul, one, mat): h = len(mat) w = len(mat[0]) assert h == w self.n = h self.add = add self.zero = zero self.mul = mul self.one = one self.mat = self._zeros() for i in range(self.n): for j in range(self.n): self.mat[i][j] = mat[i][j] def pow(self, k: int): mat = self._mat() res = self._identity() while k != 0: z = (k&-k).bit_length()-1 for _ in range(z): mat = self._mul_mat(mat, mat) k >>= z k -= 1 res = self._mul_mat(res, mat) return res def _mat(self): res = self._zeros() for i in range(self.n): for j in range(self.n): res[i][j] = self.mat[i][j] return res def _zeros(self): return [[self.zero]*self.n for _ in range(self.n)] def _identity(self): ret = self._zeros() for i in range(self.n): ret[i][i] = self.one return ret def _mul_mat(self, a, b): res = self._zeros() for i in range(self.n): for j in range(self.n): s = self.zero for k in range(self.n): s = self.add(s, self.mul(a[i][k], b[k][j])) res[i][j] = s return res @staticmethod def mul_mat_vec(mat, vec, add, zero, mul): n = len(mat) res = [zero]*n for i in range(n): for j in range(n): res[i] = add(res[i], mul(mat[i][j], vec[j])) return res # |a, b| |x| |(a⊗x)⊕(b⊗y)| # |c, d| |y| = |(c⊗x)⊕(d⊗y)| def add(a, b): return (a+b)%MOD zero = 0 def mul(a, b): return (a*b)%MOD one = 1 def prime(num): num = int(num) p = [] if num < 2: return p p.append(2) memo = [i%2 for i in range(num+1)] for i in range(3, num+1, 2): if memo[i] == 0: continue p.append(i) for j in range(i, num+1, i): memo[j] = 0 return p L = 10**7 P = prime(L) pset = set(P) good = [] for p in P: if p>>1&1: q = p^2 if q in pset: good.append(p) for _ in range(int(input())): N, M = map(int, input().split()) if N == 1: ans = bisect_right(P, M) else: good_cnt = bisect_right(good, M) mat = [[0, 1], [good_cnt*2, 1]] MAT = MatrixPow(add, zero, mul, one, mat) mat = MAT.pow(N-1) vec = [1, good_cnt*2] ans = sum(MAT.mul_mat_vec(mat, vec, add, zero, mul))%MOD print(ans)