#include <fstream>
#include <algorithm>
#include <queue>
#include <string>
#include <vector>
#include <stack>
#include <map>
using namespace std;
ifstream cin("sumdiv.in");
ofstream cout("sumdiv.out");
string s;
long long v[200005];
long long dp[200005];
long long poz[10005];
vector<pair<long long,long long> >vec;
long long prim[40005];
long long cnt=0;
long long inf=1e14;
long long mod=1000000007;
long long exp(long long val,long long exp)
{
val=val%mod;
long long prod=1;
while(exp)
{
if(exp%2==1)
{
prod=(prod*val)%mod;
}
exp=exp/2;
val=(val*val)%mod;
}
return prod;
}
long long invs(long long val)
{
return exp(val,mod-2);
}
int main()
{
long long n,i,j,k,l,z,m,a,b,t=1,suma=0,h,poz1,poz2,c,d,c1,c2,nra,nrc,sol,x2,y2,val,op,q,tip,gc,prod,u,dr,st,diffst,diffdr,ramase,nr,cate,curr,rez,rad,rest,ultimu,primu,leng,e,f,semn,imp,aux,diff;
ios_base::sync_with_stdio(false);
cin.tie(NULL);
t=1;
string s;
string s1;
char ch;
long long maxim=2*1e9;
long long minim=2*-1e9;
pair<long long,long long>rasp;
cin>>n>>k;
if(k==0)
{
cout<<1;
return 0;
}
while(n%mod==0)
{
n=n/mod;
}
long long div=2;
long long cop=n;
long long mul=1;
while(div*div<=cop)
{
prod=1;
while(n%div==0)
{
prod=prod*div;
n=n/div;
}
if(prod!=1)
{
mul=(mul*((exp(prod,k)*div)%mod+mod-1))%mod;
mul=(mul*invs(div-1))%mod;
}
div++;
}
prod=n;
if(n!=1)
{
mul=(mul*(exp(prod,k+1)+mod-1))%mod;
mul=(mul*invs(prod-1))%mod;
}
cout<<mul;
return 0;
}