結果
問題 | No.824 Many Shifts Hard |
ユーザー | maroon_kuri |
提出日時 | 2019-04-27 00:00:48 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 129 ms / 2,000 ms |
コード長 | 6,024 bytes |
コンパイル時間 | 1,542 ms |
コンパイル使用メモリ | 172,924 KB |
実行使用メモリ | 53,828 KB |
最終ジャッジ日時 | 2024-11-25 08:32:11 |
合計ジャッジ時間 | 4,193 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 38 ms
52,164 KB |
testcase_01 | AC | 36 ms
52,528 KB |
testcase_02 | AC | 67 ms
52,164 KB |
testcase_03 | AC | 95 ms
52,800 KB |
testcase_04 | AC | 85 ms
52,440 KB |
testcase_05 | AC | 118 ms
53,572 KB |
testcase_06 | AC | 42 ms
52,424 KB |
testcase_07 | AC | 71 ms
52,804 KB |
testcase_08 | AC | 117 ms
53,448 KB |
testcase_09 | AC | 103 ms
53,828 KB |
testcase_10 | AC | 58 ms
53,704 KB |
testcase_11 | AC | 68 ms
52,676 KB |
testcase_12 | AC | 92 ms
53,824 KB |
testcase_13 | AC | 111 ms
52,288 KB |
testcase_14 | AC | 124 ms
52,176 KB |
testcase_15 | AC | 120 ms
52,548 KB |
testcase_16 | AC | 71 ms
52,808 KB |
testcase_17 | AC | 129 ms
52,424 KB |
testcase_18 | AC | 37 ms
52,032 KB |
testcase_19 | AC | 37 ms
52,680 KB |
testcase_20 | AC | 125 ms
52,676 KB |
testcase_21 | AC | 38 ms
52,168 KB |
testcase_22 | AC | 126 ms
52,220 KB |
ソースコード
#include <bits/stdc++.h> #include <type_traits> using namespace std; using ll=long long; #define int ll #define FOR(i,a,b) for(int i=int(a);i<int(b);i++) #define rep(i,b) FOR(i,0,b) #define mp make_pair #define mt make_tuple #define pb push_back #define eb emplace_back #define all(x) x.begin(),x.end() auto& errStream=cerr; #ifdef LOCAL #define cerr (cerr<<"-- line "<<__LINE__<<" -- ") #else class CerrDummy{}cerrDummy; template<class T> CerrDummy& operator<<(CerrDummy&cd,const T&){ return cd; } using charTDummy=char; using traitsDummy=char_traits<charTDummy>; CerrDummy& operator<<(CerrDummy&cd,basic_ostream<charTDummy,traitsDummy>&(basic_ostream<charTDummy,traitsDummy>&)){ return cd; } #define cerr cerrDummy #endif #define REACH cerr<<"reached"<<endl #define DMP(x) cerr<<#x<<":"<<x<<endl #define ZERO(x) memset(x,0,sizeof(x)) #define ONE(x) memset(x,-1,sizeof(x)) template<class T> using V=vector<T>; template<class T> using VV=V<V<T>>; using pi=pair<int,int>; using vi=vector<int>; using ld=long double; template<class T,class U> ostream& operator<<(ostream& os,const pair<T,U>& p){ os<<"("<<p.first<<","<<p.second<<")"; return os; } template<class T> ostream& operator <<(ostream& os,const vector<T>& v){ os<<"{"; rep(i,(int)v.size()){ if(i)os<<","; os<<v[i]; } os<<"}"; return os; } template<int i,class T> void print_tuple(ostream&,const T&){ } template<int i,class T,class H,class ...Args> void print_tuple(ostream&os,const T&t){ if(i)os<<","; os<<get<i>(t); print_tuple<i+1,T,Args...>(os,t); } template<class ...Args> ostream& operator<<(ostream&os,const tuple<Args...>&t){ os<<"("; print_tuple<0,tuple<Args...>,Args...>(os,t); return os<<")"; } ll read(){ ll i; scanf("%lld",&i); return i; } void printSpace(){ printf(" "); } void printEoln(){ printf("\n"); } void print(ll x,int suc=1){ printf("%lld",x); if(suc==1) printEoln(); if(suc==2) printSpace(); } template<class T> void print(const vector<T>&v,int suc=1){ rep(i,v.size()) print(v[i],i==int(v.size())-1?suc:2); } string readString(){ static char buf[3341000]; scanf("%s",buf); return string(buf); } char* readCharArray(){ static char buf[3341000]; static int bufUsed=0; char* ret=buf+bufUsed; scanf("%s",ret); bufUsed+=strlen(ret)+1; return ret; } template<class T,class U> void chmax(T& a,U b){ if(a<b) a=b; } template<class T,class U> void chmin(T& a,U b){ if(b<a) a=b; } template<class T> T Sq(const T& t){ return t*t; } #define CAPITAL void Yes(bool ex=true){ #ifdef CAPITAL cout<<"YES"<<endl; #else cout<<"Yes"<<endl; #endif if(ex)exit(0); } void No(bool ex=true){ #ifdef CAPITAL cout<<"NO"<<endl; #else cout<<"No"<<endl; #endif if(ex)exit(0); } const ll infLL=LLONG_MAX/3; #ifdef int const int inf=infLL; #else const int inf=INT_MAX/2-100; #endif constexpr ll TEN(int n){ return n==0?1:TEN(n-1)*10; } template<class T> vector<T> Uniqued(const vector<T>&vv){ auto v(vv); sort(all(v)); v.erase(unique(all(v)),v.end()); return v; } template<class T> void MakeUniqued(vector<T>&v){ sort(all(v)); v.erase(unique(all(v)),v.end()); } template<int mod> struct ModInt{ static constexpr int base=mod; int v; ModInt():v(0){} ModInt(ll vv){ v=vv%mod; if(v<0)v+=mod; } explicit operator bool()const{ return v; } explicit operator int()const{ return v; } bool operator==(const ModInt&rhs)const{ return v==rhs.v; } bool operator!=(const ModInt&rhs)const{ return v!=rhs.v; } ModInt operator-()const{ return ModInt(0)-*this; } ModInt& operator+=(const ModInt&rhs){ v+=rhs.v; if(v>=mod)v-=mod; return *this; } ModInt&operator-=(const ModInt&rhs){ v-=rhs.v; if(v<0)v+=mod; return *this; } ModInt&operator*=(const ModInt&rhs){ v=ll(v)*rhs.v%mod; return *this; } ModInt&operator/=(const ModInt&rhs){ operator*=(rhs.inv()); return *this; } ModInt operator+(const ModInt&rhs)const{ return ModInt(*this)+=rhs; } ModInt operator-(const ModInt&rhs)const{ return ModInt(*this)-=rhs; } ModInt operator*(const ModInt&rhs)const{ return ModInt(*this)*=rhs; } ModInt operator/(const ModInt&rhs)const{ return ModInt(*this)/=rhs; } friend ModInt operator+(int x,const ModInt&y){ return ModInt(x)+y; } friend ModInt operator-(int x,const ModInt&y){ return ModInt(x)-y; } friend ModInt operator*(int x,const ModInt&y){ return ModInt(x)*y; } friend ModInt operator/(int x,const ModInt&y){ return ModInt(x)/y; } ModInt pow(int n)const{ ModInt res(1),x(*this); while(n){ if(n&1)res*=x; x*=x; n>>=1; } return res; } ModInt inv()const{ return pow(mod-2); } }; template<int mod> ostream& operator<<(ostream&os,const ModInt<mod>&m){ return os<<m.v; } template<int mod> void print(const ModInt<mod>&m,int suc=1){ print(m.v,suc); } using mint=ModInt<1000000007>; //using mint=ModInt<998244353>; const int Vmax=min<int>(2000010,mint::base); mint fact[Vmax],factInv[Vmax],invs[Vmax]; void InitFact(){ fact[0]=1; FOR(i,1,Vmax){ fact[i]=fact[i-1]*i; } factInv[Vmax-1]=fact[Vmax-1].inv(); for(int i=Vmax-2;i>=0;i--){ factInv[i]=factInv[i+1]*(i+1); } for(int i=Vmax-1;i>=1;i--){ invs[i]=factInv[i]*fact[i-1]; } } struct InitFactDummy{ InitFactDummy(){ InitFact(); } } initFactDummy; mint Choose(int n,int k){ return fact[n]*factInv[n-k]*factInv[k]; } mint Binom(int a,int b){ return fact[a+b]*factInv[a]*factInv[b]; } mint Catalan(int n){ return Binom(n,n)-(n-1>=0?Binom(n-1,n+1):0); } const int Kmax=310; mint dp[2][Kmax][Kmax]; signed main(){ int n=read(),k=read(); if(n==1){ print(0); return 0; } int cur=0; FOR(i,1,n+1){ int j=min(n-i,Kmax-5); dp[cur][j][j+1]+=i; } const mint in=mint(n).inv(); rep(_,k){ int nx=cur^1; ZERO(dp[nx]); rep(i,Kmax)FOR(j,i+1,Kmax){ auto w=dp[cur][i][j]*in; dp[nx][i][j-1]+=w; if(i==0){ dp[nx][i][j]+=w*(n-1); }else{ dp[nx][i][j]+=w*(n-2); dp[nx][i-1][j]+=w; } } cur=nx; } mint ans=0; rep(i,Kmax)FOR(j,i+1,Kmax) ans+=dp[cur][i][j]; ans*=mint(n).pow(k); print(ans); }