#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;
}
