#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0; i<n; i++)
#define Sort(vector) sort(vector.begin(), vector.end())
#define Reverse(vector) reverse(vector.begin(), vector.end())
#define RSort(vector) sort(vector.rbegin(), vector.rend())
using ll = long long;
using P = pair<int,int>;
using TU = tuple<int,int,int>;
using vint = vector<int>;
using vvint = vector<vint>;
using vvvint = vector<vvint>;
using vll = vector<ll>;
using vvll = vector<vll>;
using vvvll = vector<vvll>;
template<typename T> istream &operator>>(istream &is,vector<T> &v){for(T &in:v){is>>in;}return is;}
template<typename T> ostream &operator<<(ostream &os,vector<T> &v){for(int i=0;i<(int)v.size();i++){os<<v[i]<<" \n"[i==(int)v.size()-1];}return os;}
template<typename T> istream &operator>>(istream &is,vector<vector<T>> &v){for(vector<T> &in:v){is>>in;}return is;}
template<typename T> ostream &operator<<(ostream &os,vector<vector<T>> &v){for(vector<T> &out:v){os<<out;}return os;}

template<int m>
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<typename T>
  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<<x._v;}

private:
  unsigned int _v;
  static constexpr unsigned int umod() noexcept {return m;}
};
// using mint=Modint<998244353>;
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;
}