import sys input = sys.stdin.readline from bisect import bisect mod=998244353 # 行列の計算(numpyを使えないとき,modを使用) def prod(A,B,k,l,m):# A:k*l,B:l*m C=[[None for i in range(m)] for j in range(k)] for i in range(k): for j in range(m): ANS=0 for pl in range(l): ANS=(ANS+A[i][pl]*B[pl][j])%mod C[i][j]=ANS return C def plus(A,B,k,l):# a,B:k*l C=[[None for i in range(l)] for j in range(k)] for i in range(k): for j in range(l): C[i][j]=(A[i][j]+B[i][j])%mod return C # x以下の素数の列挙,素因数分解,約数の列挙 x=10**7 import math L=math.floor(math.sqrt(x)) # 平方根を求める Primelist=[i for i in range(x+1)] Primelist[1]=0 # 1は素数でないので0にする. for i in Primelist: if i>L: break if i==0: continue for j in range(2*i,x+1,i): Primelist[j]=0 Primes=[Primelist[j] for j in range(x+1) if Primelist[j]!=0] D={Primes[i]:i for i in range(len(Primes))} TO=[0]*len(Primes) x=2 for j in range(len(Primes)): y=Primes[j] if x^y in D: TO[j]=1 S=[0]*len(Primes) for i in range(1,len(Primes)): S[i]=S[i-1]+TO[i] #print("!") T=int(input()) for tests in range(T): N,M=list(map(int,input().split())) x=bisect(Primes,M)-1 #print(x,Primes[x]) if N==1: print(x+1) continue ss=S[x] k=Primes[x] if k^2 in D and k^2>k: ss-=1 X=[[1,ss]] n=N-1 B=[[0,ss],[1,1]] POWB=[B] for i in range(32): POWB.append(prod(POWB[-1],POWB[-1],2,2,2)) # ベキを求めて while n: X=prod(X,POWB[n.bit_length()-1],1,2,2) # n乗の場合 n-=1<<(n.bit_length()-1) #print(X) print(sum(X[0])%mod)