結果
| 問題 |
No.2326 Factorial to the Power of Factorial to the...
|
| コンテスト | |
| ユーザー |
Ajinoko33
|
| 提出日時 | 2023-05-30 19:59:24 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 16 ms / 2,000 ms |
| コード長 | 4,154 bytes |
| コンパイル時間 | 1,894 ms |
| コンパイル使用メモリ | 194,192 KB |
| 最終ジャッジ日時 | 2025-02-13 16:45:52 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 20 |
ソースコード
#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;
}
Ajinoko33