#include<unordered_map>
#include<unordered_set>
#include<functional>
#include<algorithm>
#include<iostream>
#include<hash_map>
#include<iterator>
#include<iomanip>
#include<numeric>
#include<cstring>
#include<vector>
#include<string>
#include<deque>
#include<stack>
#include<queue>
#include<array>
#include<cmath>
#include<list>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
#define pii pair<int,int>
#define pll pair<ll,ll>
#define inf INT32_MAX
#define linf INT64_MAX
#define pf push_front
#define pb push_back
#define ppb pop_back
#define ppf pop_front
#define ff first
#define ss second
const int mod=1e9+7,N=5e4;
ll Pow(ll b,ll p){
if(!p)return 1%mod;
if(p==1)return b%mod;
ll tmp=Pow(b,p/2)%mod;
tmp=(tmp*tmp)%mod;
if(p&1)tmp=(tmp*b)%mod;
return tmp%mod;
}
ll calcLog(ll n,ll b){
ll cnt=0;
while(n>=b)cnt++,n/=b;
return cnt;
}
bool solve(){
ll x,n,ans=1;
cin>>x>>n;
set<ll>s;
for(ll i=2;i*i<=x;++i){
while(x%i==0){
s.insert(i),x/=i;
}
}
if(x>1)s.insert(x);
for(const auto &i:s){
ll prev=n/i,cur,prevBase=1,curBase=2,log=calcLog(n,i);
while(prevBase<=log){
cur=n/Pow(i,curBase);
prev-=cur;
ans=(ans*Pow(i,prevBase*prev))%mod;
prev=cur;
prevBase++,curBase++;
}
}
cout<<ans;
}
int main(){
//ios_base::sync_with_stdio(false);
//cin.tie(nullptr);
int t=1;
//cin>>t;
while(t--){
solve();
}
}
I2luY2x1ZGU8dW5vcmRlcmVkX21hcD4KI2luY2x1ZGU8dW5vcmRlcmVkX3NldD4KI2luY2x1ZGU8ZnVuY3Rpb25hbD4KI2luY2x1ZGU8YWxnb3JpdGhtPgojaW5jbHVkZTxpb3N0cmVhbT4KI2luY2x1ZGU8aGFzaF9tYXA+CiNpbmNsdWRlPGl0ZXJhdG9yPgojaW5jbHVkZTxpb21hbmlwPgojaW5jbHVkZTxudW1lcmljPgojaW5jbHVkZTxjc3RyaW5nPgojaW5jbHVkZTx2ZWN0b3I+CiNpbmNsdWRlPHN0cmluZz4KI2luY2x1ZGU8ZGVxdWU+CiNpbmNsdWRlPHN0YWNrPgojaW5jbHVkZTxxdWV1ZT4KI2luY2x1ZGU8YXJyYXk+CiNpbmNsdWRlPGNtYXRoPgojaW5jbHVkZTxsaXN0PgojaW5jbHVkZTxtYXA+CiNpbmNsdWRlPHNldD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVsbDsKdHlwZWRlZiBkb3VibGUgZGI7CiNkZWZpbmUgcGlpIHBhaXI8aW50LGludD4KI2RlZmluZSBwbGwgcGFpcjxsbCxsbD4KI2RlZmluZSBpbmYgSU5UMzJfTUFYCiNkZWZpbmUgbGluZiBJTlQ2NF9NQVgKI2RlZmluZSBwZiBwdXNoX2Zyb250CiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgcHBiIHBvcF9iYWNrCiNkZWZpbmUgcHBmIHBvcF9mcm9udAojZGVmaW5lIGZmIGZpcnN0CiNkZWZpbmUgc3Mgc2Vjb25kCmNvbnN0IGludCBtb2Q9MWU5KzcsTj01ZTQ7CmxsIFBvdyhsbCBiLGxsIHApewogICAgaWYoIXApcmV0dXJuIDElbW9kOwogICAgaWYocD09MSlyZXR1cm4gYiVtb2Q7CiAgICBsbCB0bXA9UG93KGIscC8yKSVtb2Q7CiAgICB0bXA9KHRtcCp0bXApJW1vZDsKICAgIGlmKHAmMSl0bXA9KHRtcCpiKSVtb2Q7CiAgICByZXR1cm4gdG1wJW1vZDsKfQpsbCBjYWxjTG9nKGxsIG4sbGwgYil7CiAgICBsbCBjbnQ9MDsKICAgIHdoaWxlKG4+PWIpY250Kyssbi89YjsKICAgIHJldHVybiBjbnQ7Cn0KYm9vbCBzb2x2ZSgpewogICAgbGwgeCxuLGFucz0xOwogICAgY2luPj54Pj5uOwoKICAgIHNldDxsbD5zOwogICAgZm9yKGxsIGk9MjtpKmk8PXg7KytpKXsKICAgICAgICB3aGlsZSh4JWk9PTApewogICAgICAgICAgICBzLmluc2VydChpKSx4Lz1pOwogICAgICAgIH0KICAgIH0KICAgIGlmKHg+MSlzLmluc2VydCh4KTsKCiAgICBmb3IoY29uc3QgYXV0byAmaTpzKXsKICAgICAgICBsbCBwcmV2PW4vaSxjdXIscHJldkJhc2U9MSxjdXJCYXNlPTIsbG9nPWNhbGNMb2cobixpKTsKICAgICAgICB3aGlsZShwcmV2QmFzZTw9bG9nKXsKICAgICAgICAgICAgY3VyPW4vUG93KGksY3VyQmFzZSk7CiAgICAgICAgICAgIHByZXYtPWN1cjsKICAgICAgICAgICAgYW5zPShhbnMqUG93KGkscHJldkJhc2UqcHJldikpJW1vZDsKICAgICAgICAgICAgcHJldj1jdXI7CiAgICAgICAgICAgIHByZXZCYXNlKyssY3VyQmFzZSsrOwogICAgICAgIH0KICAgIH0KICAgIGNvdXQ8PGFuczsKfQppbnQgbWFpbigpewogICAgLy9pb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIC8vY2luLnRpZShudWxscHRyKTsKICAgIGludCB0PTE7CiAgICAvL2Npbj4+dDsKICAgIHdoaWxlKHQtLSl7CiAgICAgICAgc29sdmUoKTsKICAgIH0KfQ==