#include #define chmin(x,y) (x) = min((x),(y)) #define chmax(x,y) (x) = max((x),(y)) using namespace std; using ll = long long; const ll mod = 1000000007; const vector dx = {1,0,-1,0}, dy = {0,1,0,-1}; using Graph = vector>; // https://qiita.com/drken/items/3b4fdf0a78e7a138cd9a // a^n mod を計算する long long modpow(long long a, long long n, long long mod) { long long res = 1; while (n > 0) { if (n & 1) res = res * a % mod; a = a * a % mod; n >>= 1; } return res; } // a^{-1} mod を計算する long long modinv(long long a, long long mod) { return modpow(a, mod - 2, mod); } int main(){ // input ll N,P; cin >> N >> P; // solve ll fac = 1, fer = 0; for (ll i = 1; i <= N; i++){ // update fac/fer fer *= i; fer += (fac * i) / mod; fac *= i; // take remainder of fac/fer fac %= mod; fer = (fer / mod) + fer % mod; } ll pwr = modpow(fac,fac+fer,mod); ll leg = 0; // N!がPで割り切れる回数を調べる while(N > 0){ leg += N / P; N /= P; } // output // cout << fac << " " << pwr << " " << leg << endl; cout << (leg * pwr) % mod << endl; }