#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
using namespace std;
template <class T>
inline T gcd(T x, T y) {
  return y ? gcd(y, x % y) : x;
}
template <class T>
inline T lcm(T x, T y) {
  return x / gcd(x, y) * y;
}
template <class T>
inline void adj(T &x, T y) {
  if (x >= y) x = x % y;
  while (x < 0) x = x + y;
}
template <class T>
inline T qpow(T x, long long y, T z) {
  for (; y; y >>= 1, x = x * x)
    if (y & 1) z = z * x;
  return z;
}
template <class T>
inline T mpow(long long w, T x, long long y, T z) {
  for (; y; y >>= 1, x = x * x, x = x % w)
    if (y & 1) z = z * x, z = z % w;
  return z;
}
template <class T>
inline T exgcd(T a, T b, T &x, T &y) {
  T t = a;
  b ? (t = exgcd(b, a % b, y, x), y = y - (a / b) * x) : (x = 1, y = 0);
  return t;
}
const long long MOD = 1000000007LL;
const int M = 10005;
const int N = 55;
int m, cnt;
long long n, sum, now, ans, f[M][N], inv[N];
long long dp(int x, int y) {
  if (f[x][y] >= 0) return f[x][y];
  if (!x) return 0LL;
  long long res = 0;
  for (int i = y; i <= cnt; i++) res = (res + dp(x - 1, i) * inv[i + 1]) % MOD;
  f[x][y] = res;
  return res;
}
int main() {
  scanf("%lld %d", &n, &m);
  for (int i = 1; i < 55; i++) inv[i] = mpow(MOD, 1LL * i, MOD - 2, 1LL);
  ans = 1LL;
  for (long long i = 2LL; i * i <= n; i++)
    if (n % i == 0) {
      memset((f), (-1), sizeof((f)));
      for (cnt = 0; n % i == 0; cnt++, n /= i)
        ;
      f[0][cnt] = 1LL;
      sum = 0LL;
      now = 1LL;
      for (int j = 0; j <= cnt; j++) {
        sum = (sum + now * dp(m, j)) % MOD;
        now = now * i % MOD;
      }
      ans = ans * sum % MOD;
    }
  if (n > 1LL) {
    cnt = 1;
    memset((f), (-1), sizeof((f)));
    f[0][cnt] = 1LL;
    sum = 0LL;
    now = 1LL;
    for (int j = 0; j <= cnt; j++) {
      sum = (sum + now * dp(m, j)) % MOD;
      now = now * n % MOD;
    }
    ans = ans * sum % MOD;
  }
  printf("%lld\n", ans);
  return 0;
}
