Submission #1299143

#TimeUsernameProblemLanguageResultExecution timeMemory
1299143PieArmyChess Rush (CEOI20_chessrush)C++20
51 / 100
2096 ms24204 KiB
#include<bits/stdc++.h> typedef long long ll; #define pb push_back #define fr first #define sc second #define endl '\n' using namespace std; #define mid ((left+right)>>1) const int mod=1e9+7; int sum(int x,int y){ if(x+y<mod)return x+y; return x+y-mod; } int sub(int x,int y){ if(y)y=mod-y; return sum(x,y); } int mul(ll x,ll y){ return x*y%mod; } int fpow(int x,ll y){ int res=1; while(y>0){ if(y&1)res=mul(res,x); x=mul(x,x); y>>=1; } return res; } typedef vector<vector<int>> mat; mat matmul(mat x,mat y){ int n=x.size(); mat res(n,vector<int>(n,0)); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ for(int l=0;l<n;l++){ res[i][j]=sum(res[i][j],mul(x[i][l],y[l][j])); } } } return res; } mat matpow(mat x,ll y){ int n=x.size(); mat res(n,vector<int>(n,0)); for(int i=0;i<n;i++){ res[i][i]=1; } while(y>0){ if(y&1)res=matmul(res,x); x=matmul(x,x); y>>=1; } return res; } int n,m,q; pair<int,int>dp[123][2],dp2[123][2]; int main(){ ios_base::sync_with_stdio(23^23);cin.tie(NULL); cin>>n>>m>>q; mat ma(m,vector<int>(m,0)); for(int i=0;i<m;i++){ if(i)ma[i][i-1]=1; ma[i][i]=1; if(i<m-1)ma[i][i+1]=1; } ma=matpow(ma,n-1); while(q--){ char c;cin>>c; int a,b;cin>>a>>b; if(c=='P'){ if(a==b){ cout<<n-1<<" 1\n"; } else cout<<"0 0\n"; continue; } if(c=='R'){ if(a==b){ cout<<"1 1\n"; } else cout<<"2 2\n"; continue; } if(c=='Q'){ if(a==b){ cout<<"1 1\n"; } else if(min(a,b)==1&&max(a,b)==m&&n==m){ cout<<"1 1\n"; } else{ cout<<"2 "; int cev=4; if(((n+b)&1)==((1+a)&1)){ int x=a+1,y=1+1; while(x<=m){ if(x+y==n+b){ cev++; break; } x++; y++; } x=a-1;y=1+1; while(x>0){ if(y-x==n-b){ cev++; break; } x--; y++; } } if(n==m&&(a==1||a==m||b==1||b==m)){ cev++; } cout<<cev<<endl; } continue; } if(c=='B'){ if((n+b+1+a)&1){ cout<<"0 0\n"; continue; } for(int j=1;j<=m;j++){ dp[j][0]=dp[j][1]={1e9,0}; } dp[a][0]=dp[a][1]={1,1}; for(int i=2;i<=n;i++){ for(int j=1;j<=m;j++){ dp2[j][0]=dp2[j][1]={1e9,0}; } for(int j=1;j<=m;j++){ for(int l=0;l<2;l++){ if(l){ if(j!=m){ pair<int,int>&p=dp2[j+1][1]; pair<int,int>cur=dp[j][l]; if(p.fr>=cur.fr){ if(p.fr==cur.fr)p.sc=sum(p.sc,cur.sc); else p=cur; } } if(j!=1){ pair<int,int>&p=dp2[j-1][0]; pair<int,int>cur=dp[j][l]; cur.fr++; if(p.fr>=cur.fr){ if(p.fr==cur.fr)p.sc=sum(p.sc,cur.sc); else p=cur; } } } else{ if(j!=m){ pair<int,int>&p=dp2[j+1][1]; pair<int,int>cur=dp[j][l]; cur.fr++; if(p.fr>=cur.fr){ if(p.fr==cur.fr)p.sc=sum(p.sc,cur.sc); else p=cur; } } if(j!=1){ pair<int,int>&p=dp2[j-1][0]; pair<int,int>cur=dp[j][l]; if(p.fr>=cur.fr){ if(p.fr==cur.fr)p.sc=sum(p.sc,cur.sc); else p=cur; } } } } } for(int j=1;j<=m;j++){ dp[j][0]=dp2[j][0]; dp[j][1]=dp2[j][1]; } } pair<int,int>res1=dp[b][0],res2=dp[b][1]; cout<<min(res1.fr,res2.fr)<<" "; if(res1.fr==res2.fr){ cout<<sum(res1.sc,res2.sc)<<endl; continue; } if(res1.fr<res2.fr){ cout<<res1.sc<<endl; continue; } else cout<<res2.sc<<endl; } if(c=='K'){ cout<<n-1<<" "<<ma[a-1][b-1]<<endl; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...