Oleg's favorite subjects are History and Math, and his favorite branch of mathematics is division.

To improve his division skills, Oleg came up with t pairs of integers p_i and q_i and for each pair decided to find the greatest integer x_i, such that: 

  * p_i is divisible by x_i; 
  * x_i is not divisible by q_i. 

Oleg is really good at division and managed to find all the answers quickly, how about you?

Input

The first line contains an integer t (1 ≤ t ≤ 50) — the number of pairs.

Each of the following t lines contains two integers p_i and q_i (1 ≤ p_i ≤ 10^{18}; 2 ≤ q_i ≤ 10^{9}) — the i-th pair of integers.

Output

Print t integers: the i-th integer is the largest x_i such that p_i is divisible by x_i, but x_i is not divisible by q_i.

One can show that there is always at least one value of x_i satisfying the divisibility conditions for the given constraints.

Example

Input


3
10 4
12 6
179 822


Output


10
4
179

Note

For the first pair, where p_1 = 10 and q_1 = 4, the answer is x_1 = 10, since it is the greatest divisor of 10 and 10 is not divisible by 4.

For the second pair, where p_2 = 12 and q_2 = 6, note that 

  * 12 is not a valid x_2, since 12 is divisible by q_2 = 6; 
  * 6 is not valid x_2 as well: 6 is also divisible by q_2 = 6. 

The next available divisor of p_2 = 12 is 4, which is the answer, since 4 is not divisible by 6.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.StringTokenizer;

public class division {
	public static void main(String[] args) {
		FastScanner scan=new FastScanner();
		PrintWriter out=new PrintWriter(System.out);
		
		int t=scan.nextInt();
		for(int tt=0;tt<t;tt++) {
			p=scan.nextLong();
			q=scan.nextLong();
			op=p;
			oq=q;
			
			minTake=Long.MAX_VALUE;
			
			divisible=true;
			
			boolean[] prime=new boolean[100000];
			Arrays.fill(prime,true);
			
			for(int i=2;i<prime.length;i++) {
				if(!prime[i]) continue;
				for(int j=i+i;j<prime.length;j+=i) {
					prime[j]=false;
				}
			}
			for(int i=2;i*i<=oq;i++) {
				if(prime[i]) process(i);
			}
			if(q>1) process(q);
			out.println(divisible?op/minTake:op);
		}
		
		out.close();
	}
	static long p,q;
	static long op,oq;
	static boolean divisible;
	static long minTake;
	
	public static void process(long i) {
//		System.out.println("PROCESSING "+i);
		long other=0, cur=0;
		while(q%i==0) {
			q/=i;
			other++;
		}
		while(p%i==0) {
			p/=i;
			cur++;
		}
		if(other>cur) divisible=false;
		
		if(cur==0||other==0) return;
//		System.out.println(i+" "+cur+" "+other);
		
		if(cur-other+1>0) minTake=Math.min(minTake,pow(i,cur-other+1));
	}
	public static long pow(long b, long e) {
		if(e==0) return 1L;
		if(e==1) return b;
		
		if(e%2==0) {
			long temp=pow(b,e/2);
			return temp*temp;
		}
		return b*pow(b,e-1);
	}
    static class FastScanner {
        BufferedReader br;
        StringTokenizer st;

        public FastScanner() {
            try {
                br = new BufferedReader(new InputStreamReader(System.in));
                st = new StringTokenizer(br.readLine());
            } catch (Exception e){e.printStackTrace();}
        }

        public String next() {
            if (st.hasMoreTokens()) return st.nextToken();
            try {st = new StringTokenizer(br.readLine());}
            catch (Exception e) {e.printStackTrace();}
            return st.nextToken();
        }

        public int nextInt() {return Integer.parseInt(next());}

        public long nextLong() {return Long.parseLong(next());}

        public double nextDouble() {return Double.parseDouble(next());}

        public String nextLine() {
            String line = "";
            if(st.hasMoreTokens()) line = st.nextToken();
            else try {return br.readLine();}catch(IOException e){e.printStackTrace();}
            while(st.hasMoreTokens()) line += " "+st.nextToken();
            return line;
        }
    }
}