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: Wrong Answer)

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<Long, Long> insu = new HashMap<Long,Long>();
		long c = 2;
		if(p == 1){
			System.out.println(1);
			return;
		}
		if(n == 1){
			System.out.println((long)p);
			return;
		}

		while(true){				//素因数分解
			if(p < c*c){
				break;
			}

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

				c++;
			}
		}

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

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


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

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

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

			if(keynum!= 1){
				System.out.println((long)keynum);
			}else{
				System.out.println((long)1);

			}

		}else{
			long min = (long)1000000000*1000000;

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

			if(keynum!= 1){
				System.out.println((long)keynum);
			}else{
				System.out.println((long)1);

			}
		}

	}


}

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

		return end - otherpair.end;
	}
}