제출 #1294960

#제출 시각아이디문제언어결과실행 시간메모리
1294960Davdav1232Chess Rush (CEOI20_chessrush)C++20
28 / 100
2096 ms15944 KiB
#include "arithmetics.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const ll MOD=1e9+7;
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int c, r; cin>>r>>c;
    int q; cin>>q;
    //precompute for king;
    int a=1;
    int d=1;
    while(d<r-1){
        d*=2;
        a++;
    }
    int x[2][c][c];
    for(int i=0; i<c; i++){
        for(int j=i; j<c; j++){
            if(i+1>=j) x[0][i][j]=1;
            else x[0][i][j]=0;
        }
    }
    //precompute EVERYTHING
    
    int ans1[2][c][c];
    for(int i=0; i<c; i++){
        ans1[0][i][i]=1;
        for(int j=i+1; j<c; j++){
            ans1[0][i][j]=0;
        }
    }
    d=r-1;
    int f=1;
    int g=1;
    for(int e=0; e<a; e++){
        if(e>0){
        for(int i=0; i<c; i++){
            for(int j=i; j<c; j++){
                x[g][i][j]=0;
                for(int k=0; k<=i; k++){
                    x[g][i][j]=Add(x[g][i][j], Mul(x[1-g][k][i], x[1-g][k][j]));
                }
                for(int k=i+1; k<=j; k++){
                    x[g][i][j]=Add(x[g][i][j], Mul(x[1-g][i][k], x[1-g][k][j]));
                }
                for(int k=j+1; k<c; k++){
                    x[g][i][j]=Add(x[g][i][j], Mul(x[1-g][i][k], x[1-g][j][k]));
                }
            }
        }
        g=1-g;}

        if(!((1<<e)&d)) continue;
        d-=(1<<e);
        for(int i=0; i<c; i++){
            for(int j=i; j<c; j++){
                ans1[f][i][j]=0;
                for(int k=0; k<=i; k++){
                    ans1[f][i][j]=Add(ans1[f][i][j], Mul(ans1[1-f][k][i], x[1-g][k][j]));
                }
                for(int k=i+1; k<=j; k++){
                    ans1[f][i][j]=Add(ans1[f][i][j], Mul(ans1[1-f][i][k], x[1-g][k][j]));
                }
                for(int k=j+1; k<c; k++){
                    ans1[f][i][j]=Add(ans1[f][i][j], Mul(ans1[1-f][i][k], x[1-g][j][k]));
                }
            }
        }
        f=1-f;
    }
    while(q--){
        char t; cin>>t;
        int c1, c2; cin>>c1>>c2;
        if(c1>c2) swap(c1, c2);
        if(t=='P'){
            if(c1==c2){
                cout<<r-1<<" "<<1<<"\n";
            }
            else{
                cout<<"0 0\n";
            }
            continue;
        }
        if(t=='R'){
            if(c1==c2){
                cout<<"1 1\n";
            }
            else{
                cout<<"2 2\n";
            }
            continue;
        }
        if(t=='Q'){
            if(c1==c2 || c2-c1==r-1){
                cout<<"1 1\n";
            }
            else{
                int ans=4;
                if(r==c){
                    if(c1==1 || c2==r){
                        ans++;
                    }
                }
                if((r+c2-c1-1)%2==0){
                    //check 2 cases
                    if(r-c2+1<=c1){
                        ans++;
                    }
                    c1=c+1-c1;
                    c2=c+1-c2;
                    if(r-c2+1<=c1){
                        ans++;
                    }
                }
                cout<<"2 "<<ans<<"\n";
            }
        }
        if(t=='K'){
            cout<<r-1<<" "<<ans1[1-f][c1-1][c2-1]<<"\n";
            continue;
        }
    }
    return 0;
}
#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...