#include <bits/stdc++.h>
const int maxn = 20500;
const long long mm = 1e9 + 7;
const long long inf = 1e18;
using namespace std;
long long n, cnt, f[100500], c[100500], fac[105000], inv[105000], a[105000];
struct node {
  long long x;
  int sz;
};
vector<node> vec;
int k, tot;
long long Pow(long long x, long long y) {
  long long ans = 1;
  while (y) {
    if (y & 1) ans = ans * x % mm;
    x = x * x % mm;
    y /= 2;
  }
  return ans;
}
int main() {
  fac[0] = 1;
  for (int i = 1; i <= 10000; i++) fac[i] = fac[i - 1] * i % mm;
  inv[10000] = Pow(fac[10000], mm - 2);
  for (int i = 10000; i >= 1; i--) inv[i - 1] = inv[i] * i % mm;
  for (int i = 1; i <= 10000; i++) inv[i] = inv[i] * fac[i - 1] % mm;
  scanf("%lld%d", &n, &k);
  long long x = n;
  for (long long i = 2; i * i <= x; i++)
    if (x % i == 0) {
      int sz = 0;
      while (x % i == 0) x /= i, sz++;
      vec.push_back((node){i, sz});
    }
  if (x != 1) vec.push_back((node){x, 1});
  long long ans = 1;
  for (auto x : vec) {
    for (int i = 0; i <= x.sz; i++) f[i] = 0;
    f[x.sz] = 1;
    for (int i = 1; i <= k; i++) {
      for (int j = x.sz; j >= 0; j--) c[j] = 0;
      for (int j = x.sz; j >= 0; j--) {
        for (int p = j; p >= 0; p--) {
          (c[p] += f[j] * inv[j + 1] % mm) %= mm;
        }
      }
      for (int j = x.sz; j >= 0; j--) f[j] = c[j];
    }
    long long now = 1, sum = 0;
    for (int j = 0; j <= x.sz; j++) {
      (sum += now * f[j] % mm) %= mm;
      now = now * x.x % mm;
    }
    ans = ans * sum % mm;
  }
  cout << ans << endl;
  return 0;
}
