#include <bits/stdc++.h>
using namespace std;
const int inf = 1 << 30;
const long long INF = 1ll << 60;
const double Inf = 1e20;
const double eps = 1e-9;
const int P = 1e9 + 7;
struct pair_hash {
  template <class T1, class T2>
  std::size_t operator()(const std::pair<T1, T2>& pair) const {
    return std::hash<T1>()(pair.first) ^ std::hash<T2>()(pair.second);
  }
};
unordered_map<pair<long long, int>, long long, pair_hash> f;
long long g[100];
void exgcd(long long a, long long b, long long& d, long long& x, long long& y) {
  if (!b) {
    d = a;
    x = 1;
    y = 0;
  } else {
    exgcd(b, a % b, d, y, x);
    y -= x * (a / b);
  }
}
long long inv(long long a, long long p) {
  long long d, x, y;
  exgcd(a, p, d, x, y);
  return d == 1 ? (x + p) % p : -1;
}
long long dp(long long n, int k, int z, long long v) {
  if (!k) return n;
  if (n == 1) return f[make_pair(n, k)] = 1;
  if (f[make_pair(n, k)]) return f[make_pair(n, k)];
  long long tmp = 0;
  long long gg = 1;
  for (int i = 0; i <= z; ++i) {
    tmp = (tmp + dp(gg, k - 1, i, v)) % P;
    gg *= v;
  }
  return f[make_pair(n, k)] = (tmp * g[z + 1]) % P;
}
int main() {
  long long n;
  int k;
  cin >> n >> k;
  long long tmp = 1;
  for (int i = 1; i <= 99; ++i) g[i] = inv(i, P);
  for (long long i = 2; i * i <= n; i++) {
    if (n % i == 0) {
      long long x = 1;
      int cnt = 0;
      while (n % i == 0) {
        x *= i;
        n /= i;
        ++cnt;
      }
      tmp = tmp * dp(x, k, cnt, i) % P;
    }
  }
  if (n > 1) tmp = tmp * dp(n, k, 1, n) % P;
  cout << tmp << endl;
  ;
  return 0;
}
