Submission #291188

#TimeUsernameProblemLanguageResultExecution timeMemory
291188TadijaSebezChess Rush (CEOI20_chessrush)C++11
100 / 100
421 ms8696 KiB
#include <bits/stdc++.h> using namespace std; #define pii pair<int,int> #define pb push_back int r,c; void P(int a,int b){ if(a==b)printf("%i 1\n",r-1); else printf("0 0\n"); } void R(int a,int b){ if(a==b)printf("1 1\n"); else printf("2 2\n"); } void Q(int a,int b){ if(a==b)printf("1 1\n"); else if(a+1==b+r)printf("1 1\n"); else if(a-1==b-r)printf("1 1\n"); else{ printf("2 "); int cnt=2; if(abs(a-b)<r)cnt+=2; if(a-r+1>0)cnt++; if(a+r-1<=c)cnt++; if(b-r+1>0)cnt++; if(b+r-1<=c)cnt++; int dif=(a-1)-(b-r); if(dif>0&&dif%2==0&&a-dif/2>0)cnt++; dif=(b+r)-(a+1); if(dif>0&&dif%2==0&&a+dif/2<=c)cnt++; printf("%i\n",cnt); } } #define ll long long const int mod=1e9+7; int mul(int x,int y){return (ll)x*y%mod;} int add(int x,int y){x+=y;return x>=mod?x-mod:x;} void ckadd(int&x,int y){x=add(x,y);} int sub(int x,int y){x-=y;return x<0?x+mod:x;} int pw(int x,int k){ int ans=1; for(;k;k>>=1,x=mul(x,x))if(k&1)ans=mul(ans,x); return ans; } int inv(int x){return pw(x,mod-2);} #define matrix vector<vector<int>> int BigBinom(int n,int k){ int ans=1; for(int i=1;i<=k;i++){ ans=mul(ans,mul(n-i+1,inv(i))); } return ans; } pii SolveUp(int a,int b){ if(a==1)return {mod,0}; int n=1+(r-a)/(c-1); int ost=(r-a)%(c-1); int dir=n%2; int where=dir?ost+1:c-ost; if(ost>0)n++; if(where==b)return {n,1}; if(ost==0)n++; int f; if(dir==0&&where<b)n++,f=(where+b)/2-1; else if(dir==0)f=(where-b)/2; if(dir==1&&where>b)n++,f=c+1-(where+b)/2-1; else if(dir==1)f=(b-where)/2; return {n,BigBinom(n+f-2,f)}; } void B(int a,int b){ if((a+1+b+r)%2!=0)printf("0 0\n"); else if(a+r-1==b||a-r+1==b)printf("1 1\n"); else{ pii ans1=SolveUp(a,b); pii ans2=SolveUp(c-a+1,c-b+1); if(ans1.first>ans2.first)swap(ans1,ans2); if(ans1.first==ans2.first)ckadd(ans1.second,ans2.second); printf("%i %i\n",ans1.first,ans1.second); } } const int N=1050; int dp[N][N],now[N][N]; void cl(){ for(int i=1;i<=c;i++) for(int j=1;j<=c;j++) now[i][j]=0; } void upd(){ for(int i=1;i<=c;i++) for(int j=1;j<=c;j++) dp[i][j]=now[i][j]; } void BuildKing(){ for(int i=1;i<=c;i++)dp[i][i]=1; for(int o=30;o>=0;o--){ if((r-1)>>o&1){ for(int i=1;i<=c;i++) for(int j=1;j<=c;j++) now[i][j]=add(dp[i][j],add(dp[i][j-1],dp[i][j+1])); upd(); } if(o==0)break; cl(); for(int i=1;i<=c;i++) for(int j=1;j<=c;j++) ckadd(now[1][i],mul(dp[1][j],dp[j][i])); for(int i=2;i<=c;i++){ now[i][1]=now[1][i]; for(int j=2;j<=c;j++){ if(i+j<=c+1)now[i][j]=add(now[i-1][j-1],now[1][i+j-1]); } } for(int i=2;i<=c;i++) for(int j=2;j<=c;j++) if(i+j>c+1)now[i][j]=now[c+1-i][c+1-j]; upd(); } } void K(int a,int b){ printf("%i %i\n",r-1,dp[a][b]); } int main(){ int q; scanf("%i %i %i",&r,&c,&q); BuildKing(); while(q--){ char c; int a,b; scanf("\n%c %i %i",&c,&a,&b); if(c=='P')P(a,b); if(c=='R')R(a,b); if(c=='Q')Q(a,b); if(c=='B')B(a,b); if(c=='K')K(a,b); } return 0; }

Compilation message (stderr)

chessrush.cpp: In function 'int main()':
chessrush.cpp:123:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  123 |  scanf("%i %i %i",&r,&c,&q);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~
chessrush.cpp:128:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  128 |   scanf("\n%c %i %i",&c,&a,&b);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
chessrush.cpp: In function 'std::pair<int, int> SolveUp(int, int)':
chessrush.cpp:67:20: warning: 'f' may be used uninitialized in this function [-Wmaybe-uninitialized]
   67 |  return {n,BigBinom(n+f-2,f)};
      |            ~~~~~~~~^~~~~~~~~
#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...