#include <bits/stdc++.h>
using namespace std;
struct cmp {
  bool operator()(int a, int b) { return a > b; }
};
const int N = 1e5 + 10, mod = 1e9 + 7;
struct node {
  int x, y;
};
int pr[30], ans = 1;
long long n, m, nt, cnt[N], p[N], ne[N], f[10010][60];
inline long long read() {
  long long x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
int ksm(int x, int y) {
  int ans = 1;
  while (y > 0) {
    if (y & 1) ans = (long long)ans * x % mod;
    x = (long long)x * x % mod, y >>= 1;
  }
  return ans;
}
inline void print(int x) {
  if (x < 0) putchar('-'), x = -x;
  int li = 1;
  pr[1] = x % 10;
  x /= 10;
  while (x) pr[++li] = x % 10, x /= 10;
  while (li) putchar(pr[li--] + '0');
}
int main() {
  n = read(), m = read();
  for (int i = 2; (long long)i * i <= n; i++)
    if (n % i == 0) {
      nt++, p[nt] = i, cnt[nt] = 0;
      while (n % i == 0) n /= i, cnt[nt]++;
    }
  if (n > 1) nt++, p[nt] = n, cnt[nt] = 1;
  for (int i = 1; i <= 100000; i++) ne[i] = ksm(i, mod - 2);
  for (int i = 1; i <= nt; i++) {
    memset(f, 0, sizeof(f));
    f[m][cnt[i]] = 1;
    long long x = 0, y = 1;
    for (int j = m - 1; j >= 0; j--) {
      f[j][cnt[i] + 1] = 0;
      for (int k = cnt[i]; k >= 0; k--)
        f[j][k] = (f[j + 1][k] * ne[k + 1] % mod + f[j][k + 1]) % mod;
    }
    for (int j = 0; j <= cnt[i]; j++)
      x = (y * f[0][j] % mod + x) % mod, y = y * p[i] % mod;
    ans = (long long)ans * x % mod;
  }
  printf("%d\n", ans);
  return 0;
}
