#include <bits/stdc++.h>
using namespace std;
inline void re(int &x) {
  x = 0;
  bool flag = false;
  char c = getchar();
  while (c < '0' || c > '9') {
    flag = c == '-';
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = (x << 1) + (x << 3) + (c ^ '0');
    c = getchar();
  }
  if (flag) x = -x;
  return;
}
int dp[110][10010];
long long n;
int k;
int mx = 60;
int fpow(int a, int b) {
  int ans = 1, t = a;
  while (b) {
    if (b & 1) ans = (long long)ans * t % 1000000007;
    t = (long long)t * t % 1000000007;
    b >>= 1;
  }
  return ans;
}
int inv(int x) { return fpow(x, 1000000007 - 2); }
int solve(int x, int y) {
  for (int i = 0; i <= y; i++)
    for (int j = 0; j <= k; j++) dp[i][j] = 0;
  dp[y][0] = 1;
  for (int i = 1; i <= k; i++)
    for (int j = y; j >= 0; j--) {
      int d = inv(j + 1);
      for (int l = j; l >= 0; l--)
        dp[l][i] = (dp[l][i] + (long long)dp[j][i - 1] * d) % 1000000007;
    }
  int ans = 0, now = 1;
  for (int i = 0; i <= y; i++) {
    ans = (ans + (long long)now * dp[i][k]) % 1000000007;
    now = (long long)now * x % 1000000007;
  }
  return ans;
}
int main() {
  cin >> n >> k;
  int s = sqrt(n);
  int ans = 1;
  for (int i = 2; i <= s; i++)
    if (n % i == 0) {
      int cnt = 0;
      while (n % i == 0) cnt++, n /= i;
      ans = (long long)ans * solve(i, cnt) % 1000000007;
    }
  if (n > 1) ans = (long long)ans * solve(n % 1000000007, 1) % 1000000007;
  printf("%d\n", ans);
  return 0;
}
