#include <bits/stdc++.h>   using namespace std;   namespace IO {   const int maxn(1 << 21 | 1);   char *iS, *iT, ibuf[maxn], obuf[maxn], *oS = obuf, *oT = obuf + maxn - 1, c,                                          st[20];   int f, tp, len;   inline char getc() {     return iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, maxn, stdin),                        iS == iT ? EOF : *iS++)                     : *iS++;   }   template <class T>   inline void read(T &x) {     for (c = getc(), f = 1; c <  0  || c >  9 ; c = getc()) f = c ==  -  ? -1 : 1;     for (x = 0; c >=  0  && c <=  9 ; c = getc()) x = x * 10 + (c ^ 48);     x *= f;   }   template <class T, class... Other>   inline void read(T &x, Other &...y) {     read(x), read(y...);   }   inline void flush() { fwrite(obuf, 1, oS - obuf, stdout), oS = obuf; }   inline void putc(char ch) {     *oS++ = ch;     if (oS == oT) flush();   }   template <class T>   inline void print(T x, char ch =   n ) {     if (!x) putc( 0 );     if (x < 0) putc( - ), x = -x;     while (x) st[++tp] = x % 10 +  0 , x /= 10;     while (tp) putc(st[tp--]);     putc(ch);   }   template <class T, class... Other>   inline void print(T x, Other... y) {     print(x), print(y...);   }   inline void print_str(char *s) {     for (len = strlen(s), f = 0; f < len; ++f) putc(s[f]);   }   inline void read_str(char *s, int &l) {     for (l = 0, c = getc(); (c <  a  || c >  z ) && (c <  A  || c >  Z );          c = getc())       ;     for (; (c >=  a  && c <=  z ) || (c >=  A  && c <=  Z ); c = getc())       s[l++] = c;     s[l] =   0 ;   }   }  // namespace IO   using IO ::flush;   using IO ::print;   using IO ::print_str;   using IO ::read;   using IO ::read_str;   template <class T>   inline void cmax(T &x, T y) {     x = x >= y ? x : y;   }   template <class T, class... Other>   inline void cmax(T &x, T y, Other... z) {     Cmax(x, y), Cmax(x, z...);   }   template <class T>   inline void cmin(T &x, T y) {     x = x <= y ? x : y;   }   template <class T, class... Other>   inline void cmin(T &x, T y, Other... z) {     Cmin(x, y), Cmin(x, z...);   }   inline int gcd(int x, int y) { return y ? gcd(y, x % y) : x; }   const int mod(1e9 + 7);   inline void inc(int &x, const int y) { x = x + y >= mod ? x + y - mod : x + y; }   inline void dec(int &x, const int y) { x = x - y < 0 ? x - y + mod : x - y; }   inline int add(const int x, const int y) {     return x + y >= mod ? x + y - mod : x + y;   }   inline int sub(const int x, const int y) {     return x - y < 0 ? x - y + mod : x - y;   }   inline int fpow(long long x, int y) {     long long ret = 1;     for (; y; y >>= 1, x = x * x % mod)       if (y & 1) ret = ret * x % mod;     return ret;   }   const int maxn(1e5 + 5);   int k, lg[23], ans = 1, f[55][10005], num, inv[55];   long long n, d[23];   inline int solve(int p, int lim) {     int i, j, l, ret = 0;     memset(f, 0, sizeof(f)), f[lim][0] = 1;     for (i = 1; i <= k; ++i)       for (j = 0; j <= lim; ++j)         for (l = j; l <= lim; ++l)           inc(f[j][i], (long long)f[l][i - 1] * inv[l + 1] % mod);     for (ret = 0, i = 0; i <= lim; ++i)       inc(ret, (long long)f[i][k] * fpow(p, i) % mod);     return ret;   }   int main() {     long long i;     read(n, k), ans = 1;     for (i = 1; i <= 50; ++i) inv[i] = fpow(i, mod - 2);     for (i = 2; i * i <= n; ++i)       if (n % i == 0) {         d[++num] = i;         while (n % i == 0) n /= i, ++lg[num];       }     if (n > 1) d[++num] = n, lg[num] = 1;     for (i = 1; i <= num; ++i)       ans = (long long)ans * solve(d[i] % mod, lg[i]) % mod;     print(ans);     return flush(), 0;   }