#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
long long n, k, p, q;
long long qwq[10009], cnt, f[109][10009];
int Qpow(long long a, int b) {
  a %= MOD;
  int ans = 1;
  for (; b; b >>= 1, a = 1ll * a * a % MOD)
    if (b & 1) ans = 1ll * ans * a % MOD;
  return ans;
}
const int MAX = 1e5 + 5;
map<long long, long long> ma;
struct Link_Cut_Tree {
  int top;
  int a[MAX], fa[MAX], w[MAX], st[MAX];
  int son[MAX][2];
  bool fl[MAX];
  bool is_root(int x) { return son[fa[x]][0] != x && son[fa[x]][1] != x; }
  bool GET_ID(int x) { return son[fa[x]][1] == x; }
  void pus(int x) { w[x] = w[son[x][0]] ^ w[son[x][1]] ^ a[x]; }
  void down(int x) {
    if (fl[x] && x) {
      if (son[x][0]) fl[son[x][0]] ^= 1;
      if (son[x][1]) fl[son[x][1]] ^= 1;
      swap(son[x][0], son[x][1]), fl[x] = 0;
    }
  }
  void rot(int x) {
    int y = fa[x], z = fa[y], k = GET_ID(x);
    if (!is_root(y)) son[z][GET_ID(y)] = x;
    son[y][k] = son[x][k ^ 1], son[x][k ^ 1] = y, fa[son[y][k]] = y, fa[y] = x,
    fa[x] = z;
    pus(y), pus(x);
  }
  void splay(int x) {
    int qwq = x;
    for (; !is_root(qwq); qwq = fa[qwq]) st[++top] = qwq;
    down(qwq);
    while (top) down(st[top--]);
    for (int y; !is_root(x); rot(x))
      if (!is_root(y = fa[x])) rot(GET_ID(x) == GET_ID(y) ? y : x);
  }
  void access(int x) {
    for (int y = 0; x; y = x, x = fa[x]) splay(x), son[x][1] = y, pus(x);
  }
  void make_root(int x) { access(x), splay(x), fl[x] ^= 1; }
  void split(int x, int y) { make_root(x), access(y), splay(y); }
  int GET_ROOT(int x) {
    access(x), splay(x);
    while (son[x][0]) x = son[x][0];
    return splay(x), x;
  }
  void cut(int x, int y) {
    split(x, y);
    if (son[y][0] == x) son[y][0] = fa[x] = 0;
  }
  void link(int x, int y) { make_root(x), fa[x] = y; }
  int ask(int x, int y) { return split(x, y), w[y]; }
  void change(int x, int dis) {
    access(x), splay(x);
    w[x] = a[x] = dis, pus(x);
  }
} Tree;
inline int read() {
  char c = getchar();
  int x = 0, w = 1;
  while (c > '9' || c < '0') {
    if (c == '-') w = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = x * 10 + c - '0';
    c = getchar();
  }
  return x * w;
}
long long Solve(long long q, long long t) {
  if (f[q][t]) return f[q][t];
  if (t == k) return Qpow(p, q);
  long long ans = 0, qoq = 0;
  for (int i = 0; i <= q; ++i) ++qoq, (ans += Solve(i, t + 1)) %= MOD;
  ans = ans * Qpow(qoq, MOD - 2) % MOD;
  return f[q][t] = ans;
}
int main() {
  cin >> n;
  k = read();
  long long x = n;
  for (int i = 2; i <= sqrt(n); ++i)
    while (x % i == 0) {
      if (!ma[i]) qwq[++cnt] = i;
      ma[i]++;
      x /= i;
    }
  if (x != 1) qwq[++cnt] = x, ma[x]++;
  long long ans = 1;
  for (int i = 1; i <= cnt; ++i) {
    memset(f, 0, sizeof(f));
    q = ma[qwq[i]], p = qwq[i];
    ans = ans * Solve(q, 0) % MOD;
  }
  cout << ans << endl;
}
