#include <bits/stdc++.h>
using namespace std;
const long long M = 1e9 + 7;
const long long N = 60, K = 10000 + 5;
long long dp[K][N];
long long prob[N][N];
long long n, k;
long long inv[N];
long long power(long long a, long long k) {
  if (k == 0) return 1;
  long long ans = power(a, k / 2);
  ans = (ans * ans) % M;
  if (k % 2) ans = (ans * a) % M;
  return ans;
}
void pre() {
  for (long long i = 1; i < N; i++) inv[i] = power(i, M - 2);
}
void calc(long long id, long long s) {
  memset(dp, 0, sizeof dp);
  dp[0][s] = 1;
  for (long long i = 1; i <= k; i++)
    for (long long cur = 0; cur <= s; cur++)
      for (long long prev = cur; prev <= s; prev++)
        dp[i][cur] = (dp[i][cur] + dp[i - 1][prev] * inv[prev + 1]) % M;
  for (long long i = 0; i <= s; i++) {
    prob[id][i] = dp[k][i];
  }
}
vector<pair<long long, long long> > vec;
bool next(vector<long long> &cur) {
  for (long long i = 0; i < vec.size(); i++) {
    if (cur[i] < vec[i].second) {
      cur[i]++;
      return true;
    }
    cur[i] = 0;
  }
  return false;
}
int main() {
  pre();
  cin >> n >> k;
  long long id = 0;
  for (long long i = 2; i * i <= n; i++) {
    if (n % i) continue;
    long long cnt = 0;
    while (n % i == 0) n /= i, ++cnt;
    vec.push_back({i, cnt});
    calc(id, cnt);
    ++id;
  }
  if (n > 1) {
    vec.push_back({n, 1});
    calc(id, 1);
    ++id;
  }
  vector<long long> cur(id, 0);
  long long ans = 0;
  do {
    long long val = 1;
    for (long long i = 0; i < id; i++) {
      for (long long j = 0; j < cur[i]; j++) val *= vec[i].first;
    }
    val %= M;
    long long pr = 1;
    for (long long i = 0; i < id; i++) pr = (pr * prob[i][cur[i]]) % M;
    ans = (ans + pr * val) % M;
  } while (next(cur));
  ans = (ans + M) % M;
  cout << ans << endl;
}
