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 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

// 二重にループするのが無駄
/*
線形リストに追加すればいい
NULLまで辿れる。
a = mallock()-->s
a.some = some
a.next = mallock
a = a.next
----
a.some
a.next=mallock
a=a.next

while (p != NULL) 
souka nullで初期化してくれ
*/

typedef struct _node {
  int key;
  int val;
  struct _node *next;
} node;

node *start, *t_end, *new;

node *search (int key)
{
  new = start;
  while (new != NULL) {
    if (new->key == key) return new;
  }
  return NULL;
}

int main()
{
  long long n;
  double p;
  scanf("%llu %lf",&n,&p);
  int i;
  double t = p;

  if (p == 1) {printf("1\n"); return 0;}
  else {
    int cnt = 0;
    for(i=2;i<=p;){
      double aa = t/i;
      if (aa == (long long) aa) {
        if (aa == 1) {
          if (cnt == 0) {
            start=malloc(sizeof(node));
            start->key=i; start->val=++cnt; start->next=NULL;
            break;
          } else {
            if (new->key == i) {new->val=cnt++; new->next=NULL; break;}
            new=t_end;
            new->key=i; new->val=cnt++; new->next=NULL;
            break;
          }
        } else {
          if (cnt == 0) {
            start=malloc(sizeof(node));
            start->key=i; start->val=++cnt; start->next=malloc(sizeof(node));
            t_end=start->next;
            t=aa;
            new = start;
            cnt++;
          } else {
            if (new->key == i) {new->val=cnt++; t=aa; continue;}
            new=t_end;
            new->key=i; new->val=cnt++;
            new->next=malloc(sizeof(node));
            t_end=new->next; 
            t=aa;
          }
        }
      } else {i++; cnt=(cnt==0?0:1);}
    }
  }
    int ans = 1;
    new = start;
    while (new != NULL) {
      int d=new->val/n;
      if (d>=1) ans*=pow(new->key,d);
      new=new->next;
    }
  printf("%d\n", ans);
  return 0;
}