#define _CRT_SECURE_NO_WARNINGS #include #include typedef long long ll; int N; ll a, b, c, d, e, f; int M; int nb; int table[26][26]; int save_rowes[26]; clock_t t; struct result{ int r, c; } res[10000000]; struct blocks { int row, col; int prow, pcol; int n[5][5]; } bl[66]; // templates void SetTemplates() { bl[50].n[0][0] = bl[50].n[0][1] = bl[50].n[1][0] = bl[50].n[1][1] = 1; bl[50].row = bl[50].col = 2; bl[50].prow = 1; bl[50].pcol = 1; bl[51].n[0][0] = bl[51].n[0][1] = bl[51].n[1][0] = bl[51].n[1][1] = 1; bl[51].row = bl[51].col = 2; bl[51].prow = 1; bl[51].pcol = 0; bl[52].n[0][0] = bl[52].n[0][1] = bl[52].n[1][0] = bl[52].n[1][1] = 1; bl[52].row = bl[52].col = 2; bl[52].prow = 0; bl[52].pcol = 0; bl[53].n[0][0] = bl[53].n[0][1] = bl[53].n[1][0] = bl[53].n[1][1] = 1; bl[53].row = bl[53].col = 2; bl[53].prow = 0; bl[53].pcol = 1; //--------------------- bl[10].n[0][0] = 0; bl[10].n[0][1] = bl[10].n[1][0] = bl[10].n[1][1] = 1; bl[10].row = bl[10].col = 2; bl[10].prow = 1; bl[10].pcol = 1; bl[11].n[0][1] = 0; bl[11].n[0][0] = bl[11].n[1][0] = bl[11].n[1][1] = 1; bl[11].row = bl[11].col = 2; bl[11].prow = 1; bl[11].pcol = 0; bl[12].n[1][1] = 0; bl[12].n[0][0] = bl[12].n[0][1] = bl[12].n[1][0] = 1; bl[12].row = bl[12].col = 2; bl[12].prow = 0; bl[12].pcol = 0; bl[13].n[1][0] = 0; bl[13].n[0][0] = bl[13].n[0][1] = bl[13].n[1][1] = 1; bl[13].row = bl[13].col = 2; bl[13].prow = 0; bl[13].pcol = 1; //--------------------- bl[20].n[0][0] = bl[20].n[0][1] = 0; bl[20].n[0][2] = bl[20].n[1][0] = bl[20].n[1][1] = bl[20].n[1][2] = 1; bl[20].row = 2; bl[20].col = 3; bl[20].prow = 1; bl[20].pcol = 2; bl[21].n[0][1] = bl[21].n[1][1] = 0; bl[21].n[0][0] = bl[21].n[1][0] = bl[21].n[2][0] = bl[21].n[2][1] = 1; bl[21].row = 3; bl[21].col = 2; bl[21].prow = 2; bl[21].pcol = 0; bl[22].n[1][1] = bl[22].n[1][2] = 0; bl[22].n[0][0] = bl[22].n[0][1] = bl[22].n[0][2] = bl[22].n[1][0] = 1; bl[22].row = 2; bl[22].col = 3; bl[22].prow = 0; bl[22].pcol = 0; bl[23].n[1][0] = bl[23].n[2][0] = 0; bl[23].n[0][0] = bl[23].n[0][1] = bl[23].n[1][1] = bl[23].n[2][1] = 1; bl[23].row = 3; bl[23].col = 2; bl[23].prow = 0; bl[23].pcol = 1; //----------------------- bl[30].n[0][0] = bl[30].n[0][1] = bl[30].n[0][2] = bl[30].n[0][3] = 1; bl[30].row = 1; bl[30].col = 4; bl[30].prow = 0; bl[30].pcol = 3; bl[31].n[0][0] = bl[31].n[1][0] = bl[31].n[2][0] = bl[31].n[3][0] = 1; bl[31].row = 4; bl[31].col = 1; bl[31].prow = 3; bl[31].pcol = 0; bl[32].n[0][0] = bl[32].n[0][1] = bl[32].n[0][2] = bl[32].n[0][3] = 1; bl[32].row = 1; bl[32].col = 4; bl[32].prow = 0; bl[32].pcol = 0; bl[33].n[0][0] = bl[33].n[1][0] = bl[33].n[2][0] = bl[33].n[3][0] = 1; bl[33].row = 4; bl[33].col = 1; bl[33].prow = 0; bl[33].pcol = 0; //-------------------------------- bl[40].n[0][0] = bl[40].n[2][0] = 0; bl[40].n[0][1] = bl[40].n[1][0] = bl[40].n[1][1] = bl[40].n[2][1] = 1; bl[40].row = 3; bl[40].col = 2; bl[40].prow = 2; bl[40].pcol = 1; bl[41].n[0][0] = bl[41].n[0][2] = 0; bl[41].n[0][1] = bl[41].n[1][0] = bl[41].n[1][1] = bl[41].n[1][2] = 1; bl[41].row = 2; bl[41].col = 3; bl[41].prow = 1; bl[41].pcol = 0; bl[42].n[0][1] = bl[42].n[2][1] = 0; bl[42].n[0][0] = bl[42].n[1][0] = bl[42].n[1][1] = bl[42].n[2][0] = 1; bl[42].row = 3; bl[42].col = 2; bl[42].prow = 0; bl[42].pcol = 0; bl[43].n[1][0] = bl[43].n[1][2] = 0; bl[43].n[0][0] = bl[43].n[0][1] = bl[43].n[0][2] = bl[43].n[1][1] = 1; bl[43].row = 2; bl[43].col = 3; bl[43].prow = 0; bl[43].pcol = 2; } int SetNumberBlock() { int modc, modf; c = (c xor a) + b; modc = c % 5; if (modc == 0) modc = 5; f = (f xor d) + e; modf = f % 4; return modc * 10 + modf; } void TestFullRowCol() { int num_row = 0; for (int i = 1; i <= N; i++) { int verify = 1; for (int j = 1; j <= N; j++) { if (table[i][j] == 0) { verify = 0; break; } } if (verify) { num_row++; save_rowes[num_row] = i; } } for (int j = 1; j <= N; j++) { int verify = 1; for (int i = 1; i <= N; i++) { if (table[i][j] == 0) { verify = 0; break; } } if (verify)for (int k = 1; k <= N; k++) table[k][j] = 0; } for (int k = 1; k <= num_row; k++) for (int s = 1; s <= N; s++) table[save_rowes[k]][s] = 0; } int TestFreePlace(int i, int j) { for (int rr = 0; rr < bl[nb].row; rr++) { for (int cc = 0; cc < bl[nb].col; cc++) { if (bl[nb].n[rr][cc] == 1 && table[i + rr][j + cc] == 1) return 0; } } for (int rr = 0; rr < bl[nb].row; rr++) { for (int cc = 0; cc < bl[nb].col; cc++) { if (bl[nb].n[rr][cc] == 1) table[i + rr][j + cc] = 1; } } TestFullRowCol(); return 1; } void solve() { //int nb; for (int m = 1; m <= 10000000; m++) { int v = 0; nb = SetNumberBlock(); for (int i = 1; i <= N; i++) { if (i + bl[nb].row - 1 > N) break; for (int j = 1; j <= N; j++) { if (j + bl[nb].col - 1 > N) break; if (TestFreePlace(i, j)) { res[m].r = bl[nb].prow + i; res[m].c = bl[nb].pcol + j; M = m; v++; break; } } if (v) break; } if (clock() - t > 4.8 * CLOCKS_PER_SEC) return; if (v == 0) return; } } void Input() { FILE *in = fopen("block.in", "r"); fscanf(in, "%i %lli %lli %lli %lli %lli %lli\n", &N, &a, &b, &c, &d, &e, &f); fclose(in); } void Output() { FILE *out = fopen("block.out", "w"); fprintf(out, "%i\n", M); for (int i = 1; i <= M; i++) { fprintf(out, "%i %i\n", res[i].r, res[i].c); } fclose(out); } int main() { Input(); SetTemplates(); solve(); Output(); return 0; }