#include <bits/stdc++.h>
using namespace std;
template <typename T>
ostream &operator<<(ostream &os, const vector<T> &vec) {
  os << "[";
  for (const auto &v : vec) {
    os << v << ",";
  }
  os << "]";
  return os;
}
template <typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  os << "(" << p.first << ", " << p.second << ")";
  return os;
}
long long mod_pow(long long x, long long n, long long mod) {
  long long res = 1;
  while (n > 0) {
    if (n & 1) res = res * x % mod;
    x = x * x % mod;
    n >>= 1;
  }
  return res;
}
void solve() {
  const int mod = 1e9 + 7;
  long long N, K;
  cin >> N >> K;
  map<long long, long long> cnt;
  for (long long i = 2; i * i <= N; i++) {
    if (N % i == 0) {
      while (N % i == 0) {
        N /= i;
        cnt[i]++;
      }
    }
  }
  if (N > 1) cnt[N]++;
  vector<long long> inv(61);
  for (int i = 1; i <= 60; i++) {
    inv[i] = mod_pow(i, mod - 2, mod);
  }
  vector<long long> D;
  vector<vector<vector<long long>>> dp(
      K + 1, vector<vector<long long>>(cnt.size(), vector<long long>(60)));
  int i = 0;
  for (auto c : cnt) {
    D.push_back(c.first);
    dp[0][i][c.second] = 1;
    i++;
  }
  for (int kk = 0; kk < K; kk++) {
    for (int i = 0; i < D.size(); i++) {
      for (int j = 0; j < 60; j++) {
        for (int k = 0; k <= j; k++) {
          dp[kk + 1][i][k] += dp[kk][i][j] * inv[j + 1];
          dp[kk + 1][i][k] %= mod;
        }
      }
    }
  }
  long long ans = 1;
  for (int i = 0; i < D.size(); i++) {
    long long now = 1;
    long long sum = 0;
    for (int j = 0; j < 60; j++) {
      sum += now * dp[K][i][j];
      sum %= mod;
      now *= D[i];
      now %= mod;
    }
    ans *= sum;
    ans %= mod;
  }
  cout << ans << "\n";
}
int main() {
  std::cin.tie(0);
  std::ios::sync_with_stdio(false);
  cout.setf(ios::fixed);
  cout.precision(16);
  solve();
  return 0;
}
