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# (Mono 4.6.2.0) (judge verdict: Time Limit Exceeded)

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.CompilerServices;
using static System.Math;

class P
{
    static void Main()
    {
        for (long i = 1; i < 1e12; i++)
        {
            factors(i);
        }
        long[] np = Console.ReadLine().Split().Select(long.Parse).ToArray();
        int[] v = factors(np[1]).Select(x => (int)x).ToArray();
        Dictionary<int, long> dict = new Dictionary<int, long>();
        foreach (var item in v)
        {
            if (!dict.ContainsKey(item)) dict.Add(item, 0);
            dict[item]++;
        }
        Console.WriteLine(dict.Where(x => x.Value >= np[0]).Aggregate(1L, (x, y) => x * y.Key * (y.Value / np[0])));    
    }

    static long[] factors(long n)
    {
        long firstn = n;
        long i = 2;
        List<long> res = new List<long>();
        while (i * i <= firstn + 100)
        {
            while (n % i == 0)
            {
                res.Add(i);
                n /= i;
            }
            i++;
        }
        if (n != 1) res.Add(n);
        return res.ToArray();
    }
}