#include <bits/stdc++.h>
clock_t t_;
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
unsigned long long multmod(unsigned long long a, unsigned long long b,
                           unsigned long long mod) {
  unsigned long long ret = 0;
  a %= mod;
  b %= mod;
  return a * b % 1000000007;
  while (a) {
    if (a & 1) {
      ret += b;
      ret %= mod;
    }
    a >>= 1;
    b <<= 1;
    b %= mod;
  }
  return ret % mod;
}
unsigned long long fastPow(unsigned long long a, unsigned long long x,
                           unsigned long long mod) {
  unsigned long long ret = 1;
  while (x) {
    if (x & 1) {
      ret = multmod(ret, a, mod);
      ret %= mod;
    }
    x >>= 1;
    a = multmod(a, a, mod);
    a %= mod;
  }
  return ret % mod;
}
unsigned long long dp[10010][60];
unsigned long long inv[60];
void prec() {
  for (int i = int(59); i >= int(1); i--) {
    inv[i] = fastPow(i, 1000000007 - 2, 1000000007);
  }
}
unsigned long long solve(unsigned long long n, int k, unsigned long long pr) {
  memset(dp, 0, sizeof(dp));
  int times = 0;
  unsigned long long mult = n;
  while (mult % pr == 0) {
    times++;
    mult /= pr;
  }
  dp[0][times] = 1;
  for (int i = int(1); i < int(k + 1); i++) {
    for (int j = int(0); j < int(times + 1); j++) {
      for (int jj = int(j); jj < int(times + 1); jj++) {
        dp[i][j] += dp[i - 1][jj] * inv[jj + 1];
        dp[i][j] %= 1000000007;
      }
    }
  }
  unsigned long long ans = 0;
  unsigned long long act = 1;
  for (int i = int(0); i < int(times + 1); i++) {
    ans += dp[k][i] * act;
    ans %= 1000000007;
    act *= pr;
    act %= 1000000007;
  }
  return ans % 1000000007;
}
bool pr[31622780];
vector<int> primes;
int main(int argc, const char* argv[]) {
  t_ = clock();
  unsigned long long n, k;
  cin >> n >> k;
  prec();
  unsigned long long temp = n;
  unsigned long long sqt = sqrt(n) + 1;
  memset(pr, 1, sizeof(pr));
  pr[0] = pr[1] = false;
  unsigned long long ans = 1;
  for (int i = int(2); i < int(sqt); i++) {
    if (pr[i]) {
      if (n % i == 0) {
        unsigned long long ret = 1;
        if (n % i == 0) {
          while (n % i == 0) {
            n /= i;
            ret *= i;
          }
          (ans *= solve(ret, k, i)) %= 1000000007;
        }
      }
      for (unsigned long long j = 2 * i; j <= sqt; j += i) {
        pr[j] = false;
      }
    }
  }
  if (n > 1) {
    (ans *= solve(n, k, n)) %= 1000000007;
  }
  cout << ans << "\n";
  t_ = clock() - t_;
  cerr << setprecision(9) << fixed << ((float)t_ / CLOCKS_PER_SEC) << endl;
  return 0;
}
