#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e18;
const long long mod = 1e9 + 7;
const long long N = 5e5 + 10;
inline long long add(long long x, long long y) {
  x += y;
  if (x >= mod) x -= mod;
  return x;
}
inline long long mul(long long x, long long y) {
  x = (1LL * x * y) % mod;
  return x;
}
inline long long pow_(long long x, long long y, long long p = mod) {
  long long r = 1;
  while (y) {
    if (y & 1) r = r * x % p;
    y >>= 1;
    x = x * x % p;
  }
  return r;
}
inline long long inv_(long long x) { return pow_(x, mod - 2, mod); }
long long gcd(long long a, long long b) {
  if (a == 0) return b;
  return gcd(b % a, a);
}
long long lcm(long long a, long long b) { return a * (b / gcd(a, b)); }
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  long long n, k;
  cin >> n >> k;
  vector<pair<long long, long long> > v;
  for (long long i = 2; i * i <= n; i++) {
    if (n % i == 0) {
      long long ct = 0;
      while (n % i == 0) n /= i, ct++;
      v.push_back(make_pair(i, ct));
    }
  }
  if (n != 1) v.push_back(make_pair(n, 1));
  long long ans = 1;
  for (auto x : v) {
    long long q = x.first;
    long long cc = x.second;
    long long dp[cc + 1][k + 1];
    for (long long i = 0; i <= cc; i++) dp[i][0] = pow_(q, i);
    for (long long i = 0; i <= k; i++) dp[0][i] = 1;
    long long pre[cc + 1];
    pre[0] = 1;
    for (long long i = 1; i <= cc; i++) pre[i] = add(pre[i - 1], dp[i][0]);
    for (long long j = 1; j <= k; j++) {
      for (long long i = 1; i <= cc; i++) {
        dp[i][j] = mul(pre[i], inv_(i + 1));
      }
      pre[0] = 1;
      for (long long i = 1; i <= cc; i++) pre[i] = add(pre[i - 1], dp[i][j]);
    }
    ans = mul(ans, dp[cc][k]);
  }
  cout << ans;
  return 0;
}
