#include <bits/stdc++.h>
std::vector<std::pair<int, int>> v;
void split(long long int n) {
  int k = __builtin_ctzll(n);
  if (k) v.emplace_back(2, k), n >>= k;
  for (int i = 3; (long long int)i * i <= n; i += 2)
    if (n % i == 0) {
      0;
      k = 0;
      do n /= i, ++k;
      while (n % i == 0);
      v.emplace_back(i, k);
    }
  if (n != 1) v.emplace_back(n % ((int)1e9 + 7), 1);
}
long long int inv(long long int k) {
  long long int a = k, b = ((int)1e9 + 7), ca = 1, cb = 0;
  while (b) {
    long long int c = a / b, t, ct;
    t = a % b, ct = ca - cb * c;
    a = b, ca = cb;
    b = t, cb = ct;
  }
  return ca < 0 ? ca + ((int)1e9 + 7) : ca;
}
int a[64][64], tab[64][64], tmp[64][64];
void mul(int c[64][64], int a[64][64], int b[64][64]) {
  for (int i = 0; i < 64; ++i) {
    for (int j = 0; j < 64; ++j) {
      c[i][j] = 0;
      for (int k = 0; k < 64; ++k)
        c[i][j] = (c[i][j] + (long long int)a[i][k] * b[k][j]) % ((int)1e9 + 7);
    }
  }
}
int count(int bs = 1, int x = 0) {
  if (x == (int)v.size()) return bs;
  long long int res = 0;
  for (int i = 0; i <= v[x].second; ++i) {
    res +=
        count((long long int)bs * tab[v[x].second][i] % ((int)1e9 + 7), x + 1);
    bs = (long long int)bs * v[x].first % ((int)1e9 + 7);
  }
  return res % ((int)1e9 + 7);
}
int main() {
  for (int i = 0; i < 64; ++i) {
    int k = inv(i + 1);
    for (int j = 0; j <= i; ++j) a[i][j] = k;
  }
  for (int i = 0; i < 64; ++i) tab[i][i] = 1;
  long long int n;
  int k;
  scanf("%lld%d", &n, &k);
  while (k) {
    if (k & 1) mul(tmp, tab, a), memcpy(tab, tmp, sizeof(tab));
    mul(tmp, a, a), memcpy(a, tmp, sizeof(a));
    k >>= 1;
  }
  split(n);
  0;
  for (auto it : v) 0;
  0;
  0;
  for (int i = 0; i < 8; ++i) {
    for (int j = 0; j < 8; ++j) 0;
    0;
  }
  printf("%d\n", count());
  return 0;
}
