#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const long long LINF = 0x3f3f3f3f3f3f3f3f;
const int MOD = (int)1e9 + 7;
const int N = (int)-1;
long long n;
int k;
vector<pair<long long, int> > pf;
void DPF(long long x) {
  pf.clear();
  for (long long i = 2; i * i <= x; ++i)
    if (x % i == 0) {
      int cnt = 0;
      while (x % i == 0) x /= i, cnt++;
      pf.push_back(make_pair(i, cnt));
    }
  if (x > 1) pf.push_back(make_pair(x, 1));
}
inline int add(int a, int b) { return (a += b) >= MOD ? a - MOD : a; }
inline int mul(int a, int b) { return 1ll * a * b % MOD; }
int dp[60], inv[60], pw[60];
int work(long long p, int q) {
  memset(dp, 0, sizeof(dp));
  dp[q] = 1;
  for (int j = (1); j < (k + 1); ++j)
    for (int i = (0); i < (q + 1); ++i)
      for (int ii = (i); ii < (q + 1); ++ii) {
        if (ii == i)
          dp[i] = mul(dp[ii], inv[ii + 1]);
        else
          dp[i] = add(dp[i], mul(dp[ii], inv[ii + 1]));
      }
  pw[0] = 1;
  for (int i = (1); i < (q + 1); ++i) pw[i] = mul(pw[i - 1], p % MOD);
  int res = 0;
  for (int i = (0); i < (q + 1); ++i) res = add(res, mul(dp[i], pw[i]));
  return res;
}
void Init() {
  DPF(n);
  inv[1] = 1;
  for (int i = (2); i < (60); ++i)
    inv[i] = (long long)(MOD - MOD / i) * inv[MOD % i] % MOD;
}
int Solve() {
  int ans = 1;
  for (auto o : pf) ans = mul(ans, work(o.first, o.second));
  return printf("%d\n", ans);
}
int main() {
  while (~scanf("%lld%d", &n, &k)) {
    Init();
    Solve();
  }
  return 0;
}
