#include <bits/stdc++.h>   using namespace std;   const long long maxm = 1e+18;   vector<long long> prime;   long long power(long long x, long long y) {     long long res = 1;     x = x % 1000000007;     while (y > 0) {       if (y & 1) res = (res * x) % 1000000007;       y = y >> 1;       x = (x * x) % 1000000007;     }     return res;   }   void primeFactors(long long n) {     prime.clear();     while (n % 2 == 0) {       prime.push_back(2);       n = n / 2;     }     for (int i = 3; i <= sqrt(n); i = i + 2) {       while (n % i == 0) {         prime.push_back(i);         n = n / i;       }     }     if (n > 2) prime.push_back(n);   }   long long getRes(long long n, long long p) {     long long res = 1;     long long x[101];     long long i = 1;     long long j = 0;     long long z = p;     while (true) {       if (z > n) break;       x[j++] = n / z;       if (maxm / z < p) break;       z *= p;       i++;     }     for (int i = 0; i < j - 1; i++) {       x[i] -= x[i + 1];     }     long long mul = 1;     for (int i = 0; i < j; i++) {       long long val = power(power(p, mul), x[i]);       res = (res * (val) % 1000000007) % 1000000007;       mul += 1;     }     return res;   }   int main() {     long long x, n;     cin >> x >> n;     primeFactors(x);     vector<long long>::iterator ip;     ip = std::unique(prime.begin(), prime.end());     prime.resize(std::distance(prime.begin(), ip));     long long ans = 1;     for (int i = 0; i < prime.size(); i++) {       long long res = getRes(n, prime[i]);       ans = (ans * res) % 1000000007;     }     cout << ans <<   n ;   }   