Submission #1218199

#TimeUsernameProblemLanguageResultExecution timeMemory
1218199damamilaChess Rush (CEOI20_chessrush)C++20
48 / 100
1187 ms131032 KiB
#include <bits/stdc++.h>
#include "arithmetics.h"

using namespace std;

/*
constexpr int P = 1e9+7;

int Add(int a, int b) {
	int ret = a%P;
	ret = (ret<0 ? P+ret : ret) + (b%P);
	return (ret>=0 ? ret%P : ret+P);
}

int Sub(int a, int b) {
	int ret = a%P;
	ret = (ret<0 ? P+ret : ret) - (b%P);
	return (ret>=0 ? ret%P : ret+P);
}

int Mul(int a, int b) {
	int ret = (1ll*(a%P) * (b%P)) % P;
	return (ret<0 ? P+ret : ret);
}

int modpow(int base, int exp, int modulus=P) {
  base %= modulus;
  int result = 1;
  while (exp > 0) {
    if (exp & 1) result = (1ll*result * base) % modulus;
    base = (1ll*base * base) % modulus;
    exp >>= 1;
  }
  return result;
}
int modinv(int a, int modulus=P) {
  return modpow(a,modulus-2);
}

int Div(int a, int b) {
	int ret = b%P;
	ret = (1ll*(a%P) * modinv(ret<0 ? P+ret : ret)) % P;
	return (ret<0 ? P+ret : ret);
}
*/
 
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);  
	int r, c, q;
	cin >> r >> c >> q;
	int logr = log2(r)+1;
	vector<vector<vector<int>>> jump(logr, vector<vector<int>> (c+1, vector<int> (c+1, 0)));
	for (int i = 1; i <= c; i++) {
		jump[0][i][i]++;
		if (i > 1) jump[0][i][i-1]++;
		if (i < c) jump[0][i][i+1]++;
	}
	for (int l = 1; l < logr; l++) {
		//~ cout << l << ": " << endl;
		for (int j = 1; j <= c; j++) {
			for (int k = 1; k <= c; k++) {
				jump[l][1][j] = Add(jump[l][1][j], Mul(jump[l-1][1][k], jump[l-1][k][j]));
				jump[l][j][1] = jump[l][1][j];
				jump[l][c][c-j+1] = jump[l][1][j];
				jump[l][c-j+1][c] = jump[l][1][j];
			}
		}
		for (int i = 2; i <= c/2; i++) {
			for (int j = i; j <= c/2; j++) {
				jump[l][i][j] = Add(jump[l][i-1][j-1], jump[l][1][i+j-1]);
			}
		}
		for (int i = c-1; i > c/2; i--) {
			for (int j = 2; j <= c-i+1; j++) {
				jump[l][i][j] = Add(jump[l][i+1][j-1], jump[l][1][i-j+1]);
			}
		}
		for (int i = 2; i <= c/2; i++) {
			for (int j = i; j <= c/2; j++) {
				jump[l][j][i] = jump[l][i][j];
				jump[l][c-j+1][c-i+1] = jump[l][i][j];
				jump[l][c-i+1][c-j+1] = jump[l][i][j];
			}
		}
		for (int i = c-1; i > c/2; i--) {
			for (int j = 2; j <= c-i+1; j++) {
				jump[l][j][i] = jump[l][i][j];
				jump[l][c-j+1][c-i+1] = jump[l][i][j];
				jump[l][c-i+1][c-j+1] = jump[l][i][j];
			}
		}
	}
	vector<vector<int>> dp1(c+1, vector<int> (c+1, 0));
	for (int i = 1; i <= c; i++) dp1[i][i] = 1;
	vector<vector<int>> dp2(c+1, vector<int> (c+1, 0));
	int tmpy = r-1;
	//~ cout << "EEK" << endl;
	for (int l = logr-1; l >= 0; l--) {
		if (tmpy >= (1<<l)) {
			//~ cout << "JA " << l << " " << (1<<l) << endl;
			tmpy -= (1<<l);
			for (int j = 1; j <= c; j++) {
				for (int k = 1; k <= c; k++) {
					dp2[1][j] = Add(dp2[1][j], Mul(dp1[1][k], jump[l][k][j]));
					dp2[j][1] = dp2[1][j];
					dp2[c][c-j+1] = dp2[1][j];
					dp2[c-j+1][c] = dp2[1][j];
				}
			}	
			for (int i = 2; i <= c/2; i++) {
				for (int j = i; j <= c/2; j++) {
					dp2[i][j] = Add(dp2[i-1][j-1], dp2[1][i+j-1]);
				}
			}
			for (int i = c-1; i > c/2; i--) {
				for (int j = 2; j <= c-i+1; j++) {
					dp2[i][j] = Add(dp2[i+1][j-1], dp2[1][i-j+1]);
				}
			}
			for (int i = 2; i <= c/2; i++) {
				for (int j = i; j <= c/2; j++) {
					dp2[j][i] = dp2[i][j];
					dp2[c-j+1][c-i+1] = dp2[i][j];
					dp2[c-i+1][c-j+1] = dp2[i][j];
				}
			}
			for (int i = c-1; i > c/2; i--) {
				for (int j = 2; j <= c-i+1; j++) {
					dp2[j][i] = dp2[i][j];
					dp2[c-j+1][c-i+1] = dp2[i][j];
					dp2[c-i+1][c-j+1] = dp2[i][j];
				}
			}
			dp1 = dp2;
			dp2 = vector<vector<int>> (c+1, vector<int> (c+1, 0));
		}
	}
	for (int i = 0; i < q; i++) {
		char s;
		int a, b;
		cin >> s >> a >> b;
		if (s == 'K') {
			cout << r-1 << " " << dp1[a][b] << "\n";
		} else cout << "0 0" << 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...