/* 很奇怪,在Eclipse里面调试要先设置断点,输入数据就可以!! He[p^k]=2 He[N]为积性函数 当N=p1^k1……pn^kn 时 He[N]=2^n 这样求HeHe[N] 就是统计1-N中每个数质因数的个数之和t,HeHe[N]=2^t 我们可以转化为 统计1-N中每个质数p在t中出现次数,p的每个倍数在t中的贡献是1,故p对t的贡献为 N/P. 这是解题报告上讲的,可是看了好久都不是很理解,那个He[n] = 2 ^ k 怎么证明出来就是想不到 看来java基本的输入输出是没有问题了。只是throws IOEception 抛出异常不要忘记了!! */ import java.util.*; import java.io.*; public class Main2879 { static final int N = 10000005; static boolean hash[] = new boolean[N]; static int prime[] = new int[N / 10]; static int p; static StreamTokenizer cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); public static void main(String[] args)throws IOException{ int t; cin.nextToken(); t = (int)cin.nval; Prime(); while(t-- > 0){ int n, mod; cin.nextToken(); n = (int)cin.nval; cin.nextToken(); mod = (int)cin.nval; long tt = Solve(n); //out.println(tt); long ans = Fun((long)2, tt, (long)mod); out.println(ans); } out.flush(); } static void Prime(){ Arrays.fill(hash, (boolean)false); int tt = (int)Math.sqrt(1.0 * N); for(int i = 2; i < tt; i++){ if(!hash[i]) for(int j = 2; j * i < N; j++) hash[j * i] = true; } p = 0; for(int i = 2; i < N; i++) if(!hash[i]) prime[p++] = i; } static long Solve(int n){ int temp = n; long sum = 0; for(int i = 0; i < p && prime[i] <= temp; i++){ sum += n / prime[i]; } return sum; } static long Fun(long n, long m, long mod){ long temp = 1; long nn = n % mod; while(m != 0){ if(m % 2 == 1){ m--; temp = (temp * nn) %mod; } else{ m >>= 1; nn = (nn * nn) % mod; } } //out.println(temp % mod); return temp % mod; } }