結果

問題 No.2326 Factorial to the Power of Factorial to the...
ユーザー Ajinoko33Ajinoko33
提出日時 2023-05-30 19:59:24
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 2 ms / 2,000 ms
コード長 4,154 bytes
コンパイル時間 1,906 ms
コンパイル使用メモリ 200,184 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-06-08 20:36:40
合計ジャッジ時間 2,434 ms
ジャッジサーバーID
(参考情報)
judge4 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 2 ms
5,376 KB
testcase_02 AC 2 ms
5,376 KB
testcase_03 AC 2 ms
5,376 KB
testcase_04 AC 2 ms
5,376 KB
testcase_05 AC 2 ms
5,376 KB
testcase_06 AC 2 ms
5,376 KB
testcase_07 AC 2 ms
5,376 KB
testcase_08 AC 2 ms
5,376 KB
testcase_09 AC 2 ms
5,376 KB
testcase_10 AC 1 ms
5,376 KB
testcase_11 AC 2 ms
5,376 KB
testcase_12 AC 2 ms
5,376 KB
testcase_13 AC 2 ms
5,376 KB
testcase_14 AC 2 ms
5,376 KB
testcase_15 AC 2 ms
5,376 KB
testcase_16 AC 2 ms
5,376 KB
testcase_17 AC 2 ms
5,376 KB
testcase_18 AC 2 ms
5,376 KB
testcase_19 AC 1 ms
5,376 KB
testcase_20 AC 1 ms
5,376 KB
testcase_21 AC 2 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#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;
}
0