Problem:
Score : 300 points

Problem Statement

There are N integers a_1, a_2, ..., a_N not less than 1.
The values of a_1, a_2, ..., a_N are not known, but it is known that a_1 \times a_2 \times ... \times a_N = P.

Find the maximum possible greatest common divisor of a_1, a_2, ..., a_N.

Constraints

1 \leq N \leq 10^{12}

1 \leq P \leq 10^{12}

Input

Input is given from Standard Input in the following format:

N P

Output

Print the answer.

Sample Input 1

3 24

Sample Output 1

2

The greatest common divisor would be 2 when, for example, a_1=2, a_2=6 and a_3=2.

Sample Input 2

5 1

Sample Output 2

1

As a_i are positive integers, the only possible case is a_1 = a_2 = a_3 = a_4 = a_5 = 1.

Sample Input 3

1 111

Sample Output 3

111

Sample Input 4

4 972439611840

Sample Output 4

206

Solution in Java8 (OpenJDK 1.8.0) (judge verdict: Runtime Error)

import java.util.HashMap;
import java.util.Scanner;

class Main{



	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);			//文字の入力
		long n = sc.nextLong();
		long p = sc.nextLong();

		HashMap<Integer, Integer> insu = new HashMap<Integer,Integer>();
		int c = 2;
		if(p == 1){
			System.out.println(1);
			return;
		}
		if(n == 1){
			System.out.println(p);
			return;
		}
		while(true){				//素因数分解
			if(p == c){
				break;
			}

			if(p%c == 0){
				if(insu.get(c) != null){
					int nn = insu.get(c) + 1;
					insu.put(c, nn);
					p /= (long)c;
					c = 2;
				}else{
					int nn =   1;
					insu.put(c, nn);
					p /= (long)c;
					c = 2;
				}
			}else{

				c++;
			}
		}

		if(insu.get(c) != null){
			int nn = insu.get(c) + 1;
			insu.put(c, nn);
			p /= (long)c;
		}else{
			int nn =   1;
			insu.put(c, nn);
			p /= (long)c;
		}

//		for(int i:insu.keySet()){				//確認
//			System.out.println("素数 "+i + " 数 "+insu.get(i));
//		}		
//		System.out.println();




		for(int i:insu.keySet()){				//整理
			if(insu.get(i) >= 2*n){
				insu.put(i*i, insu.get(i)/2);
			}
		}

		int setnum = 0;
		for(int i:insu.keySet()){			
			setnum++;
		}

		long min = 1000000000;
		int keynum = 1;
		for(int i:insu.keySet()){				//数が3つ以上のを見つける
			min = Math.min(min, i);
			if(insu.get(i) >= setnum){
				keynum *= i;
			}
		}

		if(keynum!= 0){
			System.out.println(keynum);
		}else{
			System.out.println(min);

		}



	}


}

class Pair implements Comparable{
	int from;
	int end;
	@Override
	public int compareTo(Object other) {
		Pair otherpair = (Pair)other;

		return end - otherpair.end;
	}
}