結果
問題 | No.936 Are |
ユーザー | otamay6 |
提出日時 | 2019-12-11 14:36:18 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 932 ms / 3,000 ms |
コード長 | 6,892 bytes |
コンパイル時間 | 1,886 ms |
コンパイル使用メモリ | 182,772 KB |
実行使用メモリ | 6,948 KB |
最終ジャッジ日時 | 2024-06-24 07:40:27 |
合計ジャッジ時間 | 11,606 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,816 KB |
testcase_01 | AC | 437 ms
6,940 KB |
testcase_02 | AC | 932 ms
6,944 KB |
testcase_03 | AC | 5 ms
6,940 KB |
testcase_04 | AC | 5 ms
6,940 KB |
testcase_05 | AC | 4 ms
6,940 KB |
testcase_06 | AC | 5 ms
6,940 KB |
testcase_07 | AC | 3 ms
6,940 KB |
testcase_08 | AC | 3 ms
6,944 KB |
testcase_09 | AC | 5 ms
6,948 KB |
testcase_10 | AC | 4 ms
6,940 KB |
testcase_11 | AC | 5 ms
6,944 KB |
testcase_12 | AC | 2 ms
6,944 KB |
testcase_13 | AC | 246 ms
6,944 KB |
testcase_14 | AC | 750 ms
6,944 KB |
testcase_15 | AC | 297 ms
6,940 KB |
testcase_16 | AC | 540 ms
6,940 KB |
testcase_17 | AC | 486 ms
6,940 KB |
testcase_18 | AC | 191 ms
6,940 KB |
testcase_19 | AC | 863 ms
6,940 KB |
testcase_20 | AC | 892 ms
6,944 KB |
testcase_21 | AC | 791 ms
6,940 KB |
testcase_22 | AC | 482 ms
6,940 KB |
testcase_23 | AC | 897 ms
6,944 KB |
testcase_24 | AC | 898 ms
6,944 KB |
ソースコード
#include<bits/stdc++.h> #define REP(i,n) for(int i=0,i##_len=int(n);i<i##_len;++i) #define rep(i,a,b) for(int i=int(a);i<int(b);++i) #define All(x) (x).begin(),(x).end() #define rAll(x) (x).rbegin(),(x).rend() using namespace std; using ll = long long; const ll mod=1e9+7; template<typename T> T npow(T x, ll n){ T ans = 1; while(n != 0){ if(n&1) ans = ans*x; x = x*x; n = n >> 1; } return ans; } class mint { private: ll _num,_mod; mint set(ll num){ _num = num ; if(_num<0){ if(_num>=-mod)_num=mod+_num; else _num=mod-llabs(_num)%mod; } else if(_num>=mod) _num%=mod; return *this; } ll _mpow(ll x, ll n){ ll ans = 1; if(x>=mod) x%=mod; while(n != 0){ if(n&1) ans = ans*x % _mod; x = x*x % _mod; n = n >> 1; } return ans; } ll imod(ll n){return _mpow(n , _mod-2);} public: mint(){ _num = 0;_mod=mod; } mint(ll num){ _mod = mod; _num = num; if(_num<0){ if(_num>=-mod)_num=mod+_num; else _num=mod-llabs(_num)%mod; } else if(_num>=mod) _num%=mod; } mint(ll num,ll M){ _mod=M; _num=num; if(_num<0){ if(_num>=-mod)_num=mod+_num; else _num=mod-llabs(_num)%mod; } else if(_num>=mod) _num%=mod; } mint(const mint &cp){_num=cp._num;_mod=cp._mod;} mint operator+ (const mint &x){ return mint(_num + x._num , _mod); } mint operator- (const mint &x){ return mint(_num - x._num , _mod);} mint operator* (const mint &x){ return mint(_num * x._num , _mod); } mint operator/ (mint x){ return mint(_num * imod(x._num) , _mod);} mint operator+=(const mint &x){ return set(_num + x._num); } mint operator-=(const mint &x){ return set(_num - x._num); } mint operator*=(const mint &x){ return set(_num * x._num); } mint operator/=(mint x){ return set(_num * imod(x._num));} mint operator= (const ll x){ return set(x); } mint operator+ (const ll x){return *this + mint(x,_mod); } mint operator- (const ll x){ return *this - mint(x,_mod); } mint operator* (const ll x){ return *this * mint(x,_mod); } mint operator/ (ll x){ return *this/mint(x);} mint operator+=(const ll x){ return set(_num + x); } mint operator-=(const ll x){ return set(_num - x); } mint operator*=(const ll x){ return set(_num * (x % _mod)); } mint operator/=(ll x){ return set(_num * imod(x));} bool operator<(const mint &x)const{return _num<x._num;} bool operator==(const mint &x)const{return _num==x._num;} bool operator>(const mint &x)const{return _num>x._num;} friend mint operator+(ll x,const mint &m){return mint(m._num + x , m._mod);} friend mint operator-(ll x,const mint &m){return mint( x - m._num , m._mod);} friend mint operator*(ll x,const mint &m){return mint(m._num * (x % m._mod) , m._mod);} friend mint operator/(ll x,mint m){return mint(m.imod(m._num) * (x % m._mod) , m._mod);} explicit operator ll() { return _num; } explicit operator int() { return (int)_num; } friend ostream& operator<<(ostream &os, const mint &x){ os << x._num; return os; } friend istream& operator>>(istream &is, mint &x){ll val; is>>val; x.set(val); return is;} }; bool lose(int l,int r){ return (l%5==0)&&(r%5==0); } int main(){ int N,K; cin>>N>>K; int L[2],R[2]; cin>>L[0]>>R[0]>>L[1]>>R[1]; mint dp[2][6][6][6][6]={}; mint ans=0; dp[N][L[1]][R[1]][L[0]][R[0]]=1; REP(i,K+1){ REP(a,5) REP(b,5) REP(c,5) REP(d,5){//a,b:高橋の左右、c,d:lotの左右 if((a==0&&b==0)||(c==0&&d==0)||(a==5&&b==5)||(c==5&&d==5)) continue; mint now=dp[N][a][b][c][d]; if(N&1){ if(lose((a+c)%5,d)||lose((b+c)%5,d)||lose(c,(a+d)%5)||lose(c,(b+d)%5)) continue;//勝ち確定なので考えなくていい bool D=false; REP(l,5){//詰んでないときは常に分割できる int r=a+b-l; if(r<0) continue; r%=5; if(lose(l,r)||lose((l+c)%5,r)||lose((l+d)%5,r)||lose(l,(r+c)%5)||lose(l,(r+d)%5)) continue;//分割した結果負けるのはダメ if(r==a&&l==b) continue;//分割の結果入れ替わるのはダメ if(l==a&&r==b) continue;//分割の結果変わらないのはダメ D=true; dp[0][l][r][c][d]+=now; } //行動の結果負けないなら攻撃してよい if(a!=0){ if( !lose((a+d)%5,b) && !lose((a+c+a)%5,b) && c!=0){ dp[0][a][b][(a+c)%5][d]+=now; D=true; } if( !lose((a+c)%5,b) && !lose((a+d+a)%5,b) && d!=0){ dp[0][a][b][c][(a+d)%5]+=now; D=true; } } if(b!=0){ if( !lose(a,(b+d)%5)&& !lose(a,(b+c+b)%5) && c!=0){ dp[0][a][b][(b+c)%5][d]+=now; D=true; } if(!lose(a,(b+c)%5) && !lose(a,(b+d+b)%5) &&d!=0){ dp[0][a][b][c][(b+d)%5]+=now; D=true; } } //攻撃しかできないし、どう攻撃しても詰んでるなら全ての行動を取る if(!D){ if(a!=0){ if(c!=0) dp[0][a][b][(a+c)%5][d]+=now; if(d!=0) dp[0][a][b][c][(a+d)%5]+=now; } if(b!=0){ if(c!=0) dp[0][a][b][(b+c)%5][d]+=now; if(d!=0) dp[0][a][b][c][(b+d)%5]+=now; } } } else{//lot君はあらゆる手を取る if(c!=0){ if(a!=0) dp[1][(a+c)%5][b][c][d]+=now; if(b!=0) dp[1][a][(b+c)%5][c][d]+=now; } if(d!=0){ if(a!=0) dp[1][(a+d)%5][b][c][d]+=now; if(b!=0) dp[1][a][(b+d)%5][c][d]+=now; } REP(l,5){ int r=c+d-l; if(r<0) continue; r%=5; if(l==0&&r==0) continue; if(r==c&&l==d) continue;//分割の結果 if(l==c&&r==d) continue;//分割の結果変わらないのはダメ dp[1][a][b][l][r]+=now; } } } REP(a,5) REP(b,5) REP(c,5) REP(d,5){//lot君が勝つときを加算して使いまわすために初期化 if(a==0&&b==0) ans+=dp[N][a][b][c][d]; dp[N][a][b][c][d]=0; } N=1-N; } cout<<ans<<endl; }