#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
const double PI = 3.14159265359;
long long n, k;
vector<map<long long, long long>> dp;
vector<long long> divs;
long long modpow(long long x, long long n, long long m) {
  if (n == 0) return 1 % m;
  long long u = modpow(x, n / 2, m);
  u = (u * u) % m;
  if (n % 2 == 1) u = (u * x) % m;
  return u;
}
long long solve(long long i, long long j) {
  auto it = dp[j].find(i);
  if (it != dp[j].end()) return it->second;
  long long ans = 0;
  int ct = 0;
  for (auto num : divs) {
    if (!(i % num)) {
      ans += solve(i / num, j - 1);
      ans %= MOD;
      ct++;
    }
    if (num > i) break;
  }
  ans *= modpow(ct, MOD - 2, MOD);
  ans %= MOD;
  dp[j][i] = ans;
  return ans;
}
long long solve(pair<long long, long long> p, long long j) {
  long long val = 1;
  for (int i = 0; i < p.first; i++) {
    val *= p.second;
  }
  auto it = dp[j].find(val);
  if (it != dp[j].end()) return it->second;
  long long ans = 0;
  for (int i = 0; i <= p.first; i++) {
    pair<long long, long long> p2 = {i, p.second};
    ans += solve(p2, j - 1);
    ans %= MOD;
  }
  ans *= modpow(p.first + 1, MOD - 2, MOD);
  ans %= MOD;
  dp[j][val] = ans;
  return ans;
}
vector<int> getPrimes(int stop) {
  int sieveStop = ceil(sqrt(stop));
  vector<int> psj;
  for (int i = 2; i <= sieveStop; i++) {
    bool isP = true;
    for (int j = 2; j < i && isP; j++) {
      isP = i % j;
    }
    if (isP) psj.push_back(i);
  }
  vector<bool> primesb(stop + 1, true);
  for (int j : psj) {
    for (int i = 2; i * j <= stop; i++) {
      primesb[i * j] = false;
    }
  }
  vector<int> ans;
  for (int i = 2; i <= stop; i++) {
    if (primesb[i]) ans.push_back(i);
  }
  return ans;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> k;
  dp.resize(k + 1);
  auto pr = getPrimes(5e7);
  vector<pair<long long, long long>> facts;
  for (int i : pr) {
    long long ct = 0;
    while (!(n % i)) {
      n /= i;
      ct++;
    }
    if (ct) {
      pair<long long, long long> p = {ct, i};
      facts.push_back(p);
    }
  }
  pair<long long, long long> p = {1, n};
  if (n != 1) facts.push_back(p);
  long long ans = 1;
  for (auto p : facts) {
    long long val = 1;
    for (long long i = 0; i <= p.first; i++) {
      dp[0][val] = val;
      val *= p.second;
    }
    ans *= solve(p, k);
    ans %= MOD;
  }
  cout << ans;
  return 0;
}
