#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1000000007LL;
long long n;
int k;
long long FastPow(long long num, long long pw) {
  if (pw == 0) return 1LL;
  if (pw == 1) return num;
  long long P = FastPow(num, pw / 2LL);
  P = (P * P) % MOD;
  if (pw % 2 == 1) P = (P * num) % MOD;
  return P;
}
long long div(long long q) { return FastPow(q, MOD - 2); }
long long prob[101];
long long divs[101];
void getProbs(int ctr) {
  int i, j, in;
  memset(prob, 0, sizeof(prob));
  prob[ctr] = 1;
  for (i = 1; i <= k; i++) {
    for (j = 0; j <= ctr; j++) {
      prob[j] = prob[j] * divs[j + 1];
      if (prob[j] >= MOD) prob[j] %= MOD;
      for (in = j + 1; in <= ctr; in++) {
        prob[j] += prob[in] * divs[in + 1];
        if (prob[j] >= MOD) prob[j] %= MOD;
      }
    }
  }
  return;
}
int main() {
  long long i, j;
  long long ans = 1LL;
  for (i = 1; i <= 100; i++) {
    divs[i] = div(i);
  }
  scanf("%lld", &n);
  scanf("%d", &k);
  i = 2;
  while (i <= n) {
    if (i * i > n) i = n;
    int ctr = 0;
    while (n % i == 0) {
      n /= i;
      ctr++;
    }
    if (ctr == 0) {
      i++;
      continue;
    }
    getProbs(ctr);
    long long newans = 0;
    for (j = 0; j <= ctr; j++) {
      newans += ((prob[j] * FastPow(i % MOD, j)) % MOD) * ans;
      if (newans >= MOD) newans %= MOD;
    }
    ans = newans;
    i++;
  }
  printf("%lld\n", ans);
  return 0;
}
