func_code_string: #include <bits/stdc++.h>   using namespace std;   inline int toInt(string s) {     int v;     istringstream sin(s);     sin >> v;     return v;   }   template <class T>   inline string toString(T x) {     ostringstream sout;     sout << x;     return sout.str();   }   const long long MOD = 1000000007;   long long inv[105];   vector<vector<long long>> matmul(vector<vector<long long>> a,                                    vector<vector<long long>> b) {     int n = a.size();     vector<vector<long long>> ret =         vector<vector<long long>>(n, vector<long long>(n, 0));     for (int i = 0; i < (int)n; ++i)       for (int j = 0; j < (int)n; ++j)         for (int k = 0; k < (int)n; ++k)           ret[i][j] = (ret[i][j] + a[i][k] * b[k][j]) % MOD;     return ret;   }   vector<long long> matvecmul(vector<vector<long long>> a, vector<long long> b) {     int n = a.size();     auto ret = vector<long long>(n, 0);     for (int i = 0; i < (int)n; ++i)       for (int k = 0; k < (int)n; ++k) ret[i] = (ret[i] + a[i][k] * b[k]) % MOD;     return ret;   }   vector<vector<long long>> matpow(vector<vector<long long>> a, long long p) {     vector<vector<long long>> tmp = a;     int n = a.size();     vector<vector<long long>> ret =         vector<vector<long long>>(n, vector<long long>(n, 0LL));     for (int i = 0; i < (int)n; ++i) ret[i][i] = 1LL;     while (p) {       if (p & 1) ret = matmul(ret, tmp);       tmp = matmul(tmp, tmp);       p >>= 1;     }     return ret;   }   vector<pair<long long, int>> f(long long n) {     vector<pair<long long, int>> ret;     for (long long i = 2; i * i <= n; i++) {       int cnt = 0;       while (n % i == 0) {         cnt++;         n /= i;       }       if (cnt != 0) ret.push_back(make_pair(i, cnt));     }     if (n != 1) ret.push_back(make_pair(n, 1));     return ret;   }   void init() {     inv[1] = 1LL;     for (int i = 2; i < 100; i++) {       inv[i] = MOD - inv[MOD % i] * (MOD / i) % MOD;     }   }   int main() {     long long n, k;     init();     cin >> n >> k;     vector<vector<long long>> mat(51, vector<long long>(51, 0));     for (int i = 0; i < (int)51; ++i) {       for (int j = i; j < (int)51; ++j) {         mat[i][j] = inv[j + 1];       }     }     mat = matpow(mat, k);     auto ff = f(n);     long long ret = 1;     for (auto fc : ff) {       long long ex = 0;       long long p = 1;       vector<long long> vec(51, 0);       vec[fc.second] = 1LL;       vec = matvecmul(mat, vec);       for (int i = 0; i < (int)fc.second + 1; ++i) {         ex = (ex + (p * vec[i]) % MOD) % MOD;         p = (p * fc.first) % MOD;       }       ret = (ret * ex) % MOD;     }     cout << ret << endl;     return 0;   }   