#include <bits/stdc++.h>
using namespace std;
const int NN = 100100;
const long long inf = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-6;
int sgn(double x) {
  if (fabs(x) < eps) return 0;
  if (x > 0) return 1;
  return -1;
}
const long long G = 1e9 + 7;
long long n, m, k, x, y, z, cnt, tmp, sum, num, siz;
int a[NN], vis[NN], c[NN * 10], b[NN];
char s[5000];
const double e = 2.718281828459;
const double pi = acos(-1.0);
long long poww(long long x, long long y) {
  if (y == 0) return 1;
  long long tmp = poww(x, y / 2);
  tmp = tmp * tmp % G;
  if (y & 1) tmp *= x;
  return tmp % G;
}
long long solve(long long x) {
  long long tmp = n / x, cnt = 0;
  while (tmp) {
    cnt += tmp;
    tmp /= x;
  }
  return poww(x, cnt);
}
long long pri[NN];
void prime() {
  for (int i = 2; i <= 1000000; i++) {
    if (c[i] == 0) b[++siz] = i;
    for (int j = 1; j <= siz && b[j] * i <= 1000000; j++) {
      c[b[j] * i] = 1;
    }
  }
}
int main() {
  ios::sync_with_stdio(false);
  prime();
  cin >> x >> n;
  for (int i = 1; i <= siz; i++) {
    if (x % b[i] == 0) pri[++num] = b[i];
    while (x % b[i] == 0) x /= b[i];
  }
  if (x > 1) pri[++num] = x;
  long long ans = 1;
  for (int i = 1; i <= num; i++) {
    ans *= solve(pri[i]);
    ans %= G;
  }
  cout << ans << endl;
}
