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<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
typedef long long ll;
bool used[maxn];
int mu[maxn];
vector<int> prime;
ll f[maxn];
int low[maxn];
void sieve(int size){
    //f:multiplicative function;
    mu[1] = 1;
    f[1] = 1;
    for (int i=2;i<=size;i++){
        if (!used[i]){
            prime.push_back(i);
            mu[i] = -1;
            //f:TODO
            low[i] = i;
        }
        for (int j = 0;j < prime.size();j++){
            ll nxt = 1ll * i * prime[j];
            if (nxt > size)break;
            used[nxt] = 1;
            if (i % prime[j]){
                low[nxt] = prime[j];
                mu[nxt] = -mu[i];
                //f: mod or not?
                f[nxt] = f[i] * f[prime[j]];
            }else{
                low[nxt] = prime[j] * low[i];
                mu[nxt] = 0;
                if (low[nxt] != nxt){
                    //mod or not?
                    f[nxt] = 1ll * f[low[nxt]] * f[nxt/low[nxt]];
                }else{
                    // i = prime[j] ^ k
                    //f:TODO
                }
                break;
            }
        }
    }
}

int main(){
    sieve(1e6);
    ll n,p;
    cin>>n>>p;
    ll ans = 1;
    for (int i=0;i<prime.size();i++){
        ll t = prime[i];
        int cnt = 0;
        while (p % t == 0){
            cnt ++;
            p /= t;
            if (cnt == n){
                cnt = 0;
                ans *= t;
            }
        }
    }
    if (p!= 1 && n == 1)ans *= p;
    cout<<ans<<endl;
    return 0;
}