結果
問題 | No.93 ペガサス |
ユーザー |
![]() |
提出日時 | 2019-06-06 23:11:12 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 56 ms / 5,000 ms |
コード長 | 7,195 bytes |
コンパイル時間 | 1,940 ms |
コンパイル使用メモリ | 177,932 KB |
実行使用メモリ | 44,416 KB |
最終ジャッジ日時 | 2024-10-01 21:17:17 |
合計ジャッジ時間 | 3,635 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 16 |
ソースコード
#include <bits/stdc++.h>using namespace std;using uint=unsigned;using ll=long long;using ull=unsigned 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 ROF(i,a,b) for(int i=int(b)-1;i>=a;i--)#define per(i,b) ROF(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__<<" -- ")#elseclass 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"<<endlvoid dmpr(decltype(cerr)&os){os<<endl;}template<class T,class... Args>void dmpr(decltype(cerr)&os,const T&t,const Args&... args){os<<t<<" ";dmpr(os,args...);}#define dmp(...) dmpr(cerr,##__VA_ARGS__)#define zero(x) memset(x,0,sizeof(x))#define one(x) memset(x,-1,sizeof(x))#define fs first#define sc second#define bg begin()#define ed end()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();}vi readvi(int n,int off=0){vi v(n);rep(i,n)v[i]=read()+off;return v;}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 CAPITALvoid Yes(bool ex=true){#ifdef CAPITALcout<<"YES"<<endl;#elsecout<<"Yes"<<endl;#endifif(ex)exit(0);}void No(bool ex=true){#ifdef CAPITALcout<<"NO"<<endl;#elsecout<<"No"<<endl;#endifif(ex)exit(0);}const ll infLL=LLONG_MAX/3;#ifdef intconst int inf=infLL;#elseconst int inf=INT_MAX/2-100;#endifconstexpr ll TEN(int n){return n==0?1:TEN(n-1)*10;}template<class T>vector<T> uni(const vector<T>&vv){auto v(vv);sort(all(v));v.erase(unique(all(v)),v.end());return v;}template<class T>void mkuni(vector<T>&v){sort(all(v));v.erase(unique(all(v)),v.end());}//ayasiiint topbit(signed t){return t==0?-1:31-__builtin_clz(t);}int topbit(ll t){return t==0?-1:63-__builtin_clzll(t);}int popcount(signed t){return __builtin_popcount(t);}int popcount(ll t){return __builtin_popcountll(t);}bool ispow2(int i){return i&&(i&-i)==i;}bool inc(int a,int b,int c){return a<=b&&b<=c;}#define SMOD#ifdef SMODtemplate<uint mod>#elseuint mod;#endifstruct ModInt{#ifdef SMODstatic constexpr uint base=mod;#elsestatic constexpr uint& base=mod;#endifuint v;ModInt():v(0){}ModInt(ll vv){s(vv%mod+mod);}ModInt& s(uint vv){v=vv<mod?vv:vv-mod;return *this;}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()-*this;}ModInt& operator+=(const ModInt&rhs){return s(v+rhs.v);}ModInt&operator-=(const ModInt&rhs){return s(v+mod-rhs.v);}ModInt&operator*=(const ModInt&rhs){v=ull(v)*rhs.v%mod;return *this;}ModInt&operator/=(const ModInt&rhs){return *this*=rhs.inv();}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);}};#ifdef SMODtemplate<uint mod>ostream& operator<<(ostream&os,const ModInt<mod>&m){return os<<m.v;}template<uint mod>void print(const ModInt<mod>&m,int suc=1){print(m.v,suc);}#elseostream& operator<<(ostream&os,const ModInt&m){return os<<m.v;}void print(const ModInt&m,int suc=1){print(m.v,suc);}#endif#ifdef SMODusing mint=ModInt<1000000007>;//using mint=ModInt<998244353>;#elseusing mint=ModInt;#endifconst int Vmax=(1<<21)+10;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];}}#ifdef SMODstruct InitFactDummy{InitFactDummy(){InitFact();}} initFactDummy;#endifmint 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 Nmax=1010;mint dp[Nmax][Nmax][2][2];V<mint> calc(int n){V<mint> res(n+1);res[1]=1;dp[2][0][0][0]=2;FOR(i,2,n+1){res[i]=dp[i][0][0][0];rep(j,i){rep(p,2)rep(q,2){mint a=p==0?j:j-1;mint b=p==0?2:1;mint c=p==0?0:1;mint d=i+1-a-b-c;if(j){if(q==0){dp[i+1][j-1][q][0]+=dp[i][j][p][q]*a;}else{dp[i+1][j-1][q][0]+=dp[i][j][p][q]*(a-1);dp[i+1][j-1][0][0]+=dp[i][j][p][q];}}dp[i+1][j+1][q][1]+=dp[i][j][p][q]*b;dp[i+1][j][q][1]+=dp[i][j][p][q]*c;dp[i+1][j][q][0]+=dp[i][j][p][q]*d;}}}return res;}signed main(){int n=read();auto ans=calc(n);dmp(ans);print(ans[n]);}