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 C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
 
int main(void){
 
	long long int n,p;
	long long int cur[60000] = {};
	int count[60000] = {};
	int check[60000] = {};
	int end_flag = 0;
	int index = 0;
	int i,j;
 
	long long int result;
 
	scanf("%lld %lld",&n,&p);

 	if(n == 1){
		result = p;
	}else{


 
	//素因数分解を順番にしていって、
	//N個以上ある素因数の積を返す。
 
	//2の素因数分解
	cur[index] = 2;
	while(p % cur[index] == 0 && p > 1){
		count[index]++;
		p /= cur[index];
	}
	//N個以上あったらフラグを立てる
	if(count[index] >= n){		check[index] = count[index]/n;	}
 
 
	//次の因数セット
	index++;
	cur[index] = 3;
 
	while(p > 1 && p >= cur[index] * cur[index]){
		//cur[index]の素因数分解
		while(p % cur[index] == 0 && p > 1){
			count[index]++;
			p /= cur[index];
//			printf("p=%lld(%lld)\n",p,cur[index]);
		}
		//N個以上あったらフラグを立てる
		if(count[index] >= n){		check[index] = count[index]/n;	}
 
		index++;
		cur[index] = cur[index-1] + 2;
		do{
			end_flag = 1;
			for(i=0;i<index;i++){
				if(cur[index] % cur[i] == 0){
					end_flag = 0;
					cur[index] += 2;
					break;
				}
			}
		}while(end_flag == 0);
	}
 
		result = 1;
		for(i=0;i<index;i++){
//				printf("%d: cur=%lld, count=%d, check=%d\n",i,cur[i],count[i],check[i]);
			result *= int(pow(double(cur[i]),check[i]));
		//		if(check[i] > 0){
		//			for(j = 0 ;j<check[i];j++){
		//				result *= pow(cur[i]);
		//			}
		//			printf("%d: cur=%ld, count=%ld, check=%d\n",i,cur[i],count[i],check[i]);
		//		}
		}
	}
	printf("%lld\n",result);
	return 0;
 
}