func_code_string: #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;   }   