//Accepted 204K 16MS
//约数和
//n=p1^e1*p2^e2***pk^ek
//约数和为:(p1^0+p1^1+..+p1^e1)*(p2^0+p2^1+..+p2^e2)*..(pk^0+pk^1+..pk^ek)
//现考虑: S=p1^1+p1^2+..p1^e1
// 令t=e1/2
// if (e1%2==0)
// S=(p1^1+p1^2+..+p1^t)+p1^t*(p1^1+p1^2+..+p1^t)
// if (e1%2==1)
// S=(p1^1+p1^2+..+p1^t)+p1^t*(p1^1+p1^2+..+p1^t)+p1^e1
//由此可递归求解
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
;
;
int pri[imax_n];
int cnt;
void prime()
{
cnt=;
;i<imax_n;i++)
{
for (int j=i*i;j<imax_n;j+=i)
pri[j]=;
}
;i<imax_n;i++)
)
pri[cnt++]=i;
}
int exp_mod(int a,int b)
{
;
a=a%pp;
while (b)
{
) res=res*a%pp;
a=a*a%pp;
b>>=;
}
return res;
}
int getSum(int a,int k)
{
) ;
) +a)%pp;
) +a%pp+a%pp*a%pp)%pp;
)/-);
==)
+)*temp%pp)%pp;
)*temp%pp+exp_mod(a,k))%pp;
}
int split(int n,int m)
{
;
;
;i<cnt && (__int64 )pri[i]*pri[i]<=(__int64 )n;i++)
{
)
{
t=;
)
{
t++;
n/=pri[i];
}
ans=getSum(pri[i],t*m)*ans%pp;
}
}
)
{
ans=getSum(n,m)*ans%pp;
}
return ans;
}
int main()
{
prime();
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",split(a,b));
;
}