#include <bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimize("unroll-loops")
using namespace std;
template <typename T>
constexpr long long infValue =
    std::is_same<T, int>::value ? 2000100007 : 8600000000000000007ll;
template <typename T>
constexpr long long maxValue =
    std::is_same<T, int>::value ? 1000000007 : 1000000000000000001ll;
const long long INF = infValue<long long>;
const long long MOD = 1000000007ll;
const double EPS = 1e-6;
const long long MAX = maxValue<long long>;
using pr = pair<long long, long long>;
long long n, k;
long long answ = 1ll;
long long binPow(long long a, long long p) {
  long long r = 1;
  while (p) {
    if (p & 1) r = r * a % MOD;
    a = a * a % MOD;
    p >>= 1;
  }
  return r;
}
long long dp[10010][64];
long long compute(long long prime, long long pow) {
  if (pow == 0) return 1;
  dp[0][0] = 1;
  for (register long long i = 1; i <= (pow); ++i)
    dp[0][i] = dp[0][i - 1] * prime % MOD;
  for (register long long i = 1; i <= (k); ++i) {
    dp[i][0] = 1;
    for (register long long j = 1; j <= (pow); ++j) {
      dp[i][j] = (dp[i - 1][j] + dp[i][j - 1] * j % MOD) *
                 binPow(j + 1, MOD - 2) % MOD;
    }
  }
  return dp[k][pow];
}
int main(void) {
  scanf("%lld %d", &n, &k);
  for (long long i = 2; i * i <= n; ++i) {
    long long d = 0;
    while (n % i == 0) n /= i, ++d;
    answ = answ * compute(i, d) % MOD;
  }
  if (n != 1) answ = answ * compute(n, 1) % MOD;
  printf("%lld\n", answ);
  return 0;
}
