Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define long long long int
- const int MOD = 1e9 + 7;
- long pow(long a, long n) {
- if (!n) return 1LL;
- long ans = pow(a, n >> 1LL);
- ans = (ans * ans) % MOD;
- if (!(n & 1LL)) return ans;
- return (ans * a) % MOD;
- }
- long mod_mult_inv(long a, long m) {
- assert(gcd(a, m) == 1);
- return pow(a, m - 2);
- }
- int main() {
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- long n; int k;
- cin >> n >> k;
- map<long, int> cnt;
- for (long i = 2LL; i * i <= n; i++)
- while (!(n % i)) cnt[i]++, n /= i;
- if (n > 1LL) cnt[n]++;
- int ans = 1;
- for (auto [p, c]: cnt) {
- int last = p;
- vector<int> sums(c + 1);
- vector<long> invs(c + 1);
- sums[0] = 1;
- invs[0] = 1LL;
- for (int i = 1; i <= c; i++) {
- invs[i] = mod_mult_inv(i + 1, MOD);
- sums[i] = (sums[i - 1] + last) % MOD;
- last = (last * p) % MOD;
- }
- for (int i = 0; i < k; i++) {
- vector<int> new_sums(c + 1);
- new_sums[0] = (invs[0] * sums[0]) % MOD;
- for (int j = 1; j <= c; j++) {
- last = (invs[j] * sums[j]) % MOD;
- new_sums[j] = (new_sums[j - 1] + last) % MOD;
- }
- sums = new_sums;
- }
- ans = (1LL * ans * last) % MOD;
- }
- cout << ans << "\n";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement