#include using namespace std; #define rep(i,n) for(int i=0; i; using TU = tuple; using vint = vector; using vvint = vector; using vvvint = vector; using vll = vector; using vvll = vector; using vvvll = vector; template istream &operator>>(istream &is,vector &v){for(T &in:v){is>>in;}return is;} template ostream &operator<<(ostream &os,vector &v){for(int i=0;i<(int)v.size();i++){os< istream &operator>>(istream &is,vector> &v){for(vector &in:v){is>>in;}return is;} template ostream &operator<<(ostream &os,vector> &v){for(vector &out:v){os< struct Modint{ public: static constexpr int mod() noexcept {return m;} static constexpr Modint raw(int v) noexcept { Modint x; x._v=v; return x; } constexpr Modint() noexcept :_v(0){} template constexpr Modint(T v) noexcept { long long x=v%(long long)umod(); if(x<0) x+=umod(); _v=x; } constexpr unsigned int val() const noexcept {return _v;} constexpr Modint& operator++() noexcept { ++_v; if(_v==0) _v=umod(); return *this; } constexpr Modint& operator--() noexcept { if(_v==0) _v=umod(); --_v; return *this; } constexpr Modint operator++(int) noexcept { Modint res=*this; ++*this; return res; } constexpr Modint operator--(int) noexcept { Modint res=*this; --*this; return res; } constexpr Modint& operator+=(const Modint& rhs) noexcept { _v+=rhs._v; if(_v>=umod()) _v-=umod(); return *this; } constexpr Modint& operator-=(const Modint& rhs) noexcept { _v-=rhs._v; if(_v>=umod()) _v+=umod(); return *this; } constexpr Modint& operator*=(const Modint& rhs) noexcept { unsigned long long z=_v; z*=rhs._v; _v=(unsigned int)(z%umod()); return *this; } constexpr Modint& operator/=(const Modint& rhs) noexcept { return *this*=rhs.inv(); } constexpr Modint operator+() const noexcept {return *this;} constexpr Modint operator-() const noexcept {return Modint()-*this;} constexpr Modint pow(long long n) const noexcept { assert(0<=n); Modint x=*this, res=1; while(n){ if(n&1) res*=x; x*=x; n>>=1; } return res; } // 制約: mは素数 constexpr Modint inv() const noexcept { assert(_v); return pow(umod()-2); } friend constexpr Modint operator+(const Modint& lhs,const Modint& rhs) noexcept {return Modint(lhs)+=rhs;} friend constexpr Modint operator-(const Modint& lhs,const Modint& rhs) noexcept {return Modint(lhs)-=rhs;} friend constexpr Modint operator*(const Modint& lhs,const Modint& rhs) noexcept {return Modint(lhs)*=rhs;} friend constexpr Modint operator/(const Modint& lhs,const Modint& rhs) noexcept {return Modint(lhs)/=rhs;} friend constexpr bool operator==(const Modint& lhs,const Modint& rhs) noexcept {return lhs._v==rhs._v;} friend constexpr bool operator!=(const Modint& lhs,const Modint& rhs) noexcept {return lhs._v!=rhs._v;} friend constexpr istream &operator>>(istream &is,Modint &x) noexcept { long long v; is>>v; v%=umod(); if(v<0) v+=umod(); x._v=v; return is; } friend constexpr ostream &operator<<(ostream &os,const Modint &x) noexcept {return os<; using mint=Modint<1000000007>; int main(){ int n,p;cin>>n>>p; mint res=0; for(ll val=p;val<=n;val*=p){ res+=n/val; } const ll mod=1e9+7; mint times=1; for(int i=1;i<=n;i++){ times*=i; } ll pow=1; for(int i=1;i<=n;i++){ pow*=i; pow%=mod-1; } res=res*times.pow(pow); cout<< res <<'\n'; return 0; }