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 Python (3.4.3) (judge verdict: Accepted)

# -*- coding: utf-8 -*-
"""
Created on Sat Dec 22 18:21:55 2018
CADDi2018C
@author: maezawa
""" 
import collections

n, p = list(map(int, input().split()))

if n == 1:
    ans = p
else:
    np = int(p**(1/n))
    
    # making a prime number list
    is_prime = [True]*(np+1)

    is_prime[0] = False
    is_prime[1] = False

    for i in range(2, np//2+1): # Sieve of Eratosthenes
        if is_prime[i] == True:
            for j in range(2*i,np+1,i):
                is_prime[j] = False
    
    prime_numbers = [i for i in range(np+1) if is_prime[i]]

    # prime factorization
    num = p # a number to be factorized. 
    # The maximum number to factrize is np**2. 
    
    facts = [] # list of prime factors
    for prime in prime_numbers:
        if prime > num//2:
            break
        dnum = num
        while dnum%prime == 0: 
            facts.append(prime)
            dnum = dnum//prime
    
    mul = 1
    for i in facts:
        mul *= i
    if mul != num: # if large prime number (> np) is missing
        facts.append(num//mul) # append it
    
    pfs = collections.Counter(facts)
    mostcommon = pfs.most_common()
    ans = 1
    for i, j in mostcommon:
        if j < n:
            break
        m = j // n
        ans *= i**m

print(ans)