#include #include #include #include #include using namespace std; using i32 = int32_t; using u32 = uint32_t; using i64 = int64_t; using u64 = uint64_t; #define rep(i,n) for(int i=0; i<(n); i++) vector> factorize(u64 N){ vector> res; for(u64 i=2; i*i<=N; i++){ if(N%i) continue; res.push_back({i,0}); while(N%i==0){ N/=i; res.back().second++; } } if(N!=1) res.push_back({N,1}); return move(res); } vector divs(vector> F){ vector res = {1}; for(auto f:F){ int t=res.size() * f.second; rep(i,t) res.push_back(res[i] * f.first); } return move(res); } using m32 = atcoder::static_modint<1000000007>; m32 Comb(int n, int r){ m32 ans = 1; rep(i,r) ans /= (i+1); rep(i,r) ans *= n-i; return ans; } int main(){ u64 N,K; cin >> N >> K; auto F = factorize(N); m32 ans = 1; for(auto f : F){ ans *= Comb(f.second + K, K); } cout << ans.val() << endl; return 0; } struct ios_do_not_sync{ ios_do_not_sync(){ ios::sync_with_stdio(false); cin.tie(nullptr); } } ios_do_not_sync_instance;