#include #include #define endl '\n' #define fi first #define se second #define int long long using namespace std; chrono::time_point tmr_begin; void initClock() { tmr_begin = chrono::steady_clock::now(); } double getTime() { return 1e-3 * chrono::duration_cast(chrono::steady_clock::now() - tmr_begin).count(); } void fileInOut() { freopen("block.in", "r", stdin); freopen("block.out", "w", stdout); } void fastIO() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); } const double TIME_LIMIT=4.800; const int MAXN = 30; mt19937 mt(666); int n; long long x1,_y1,x2,y2,typeB,rotB; int ind,rot; bool t[MAXN][MAXN]; vector > bl[5][4]; vector > ans; bool ok(int x,int y) { for(auto [dx,dy]: bl[ind][rot]) { int curx=x+dx; int cury=y+dy; if(curx<1 || curx>n || cury<1 || cury>n) return 0; if(t[curx][cury]==1) return 0; } return 1; } void place(int x,int y) { /*for(auto [dx,dy]: bl[ind][rot]) { int curx=x+dx; int cury=y+dy; if(curx<1 || curx>n || cury<1 || cury>n) return; if(t[curx][cury]) return; }*/ for(auto [dx,dy]: bl[ind][rot]) { int curx=x+dx; int cury=y+dy; t[curx][cury]=1; } ans.push_back({x,y}); } void clearLines() { for(int i=1;i<=n;i++) { bool fl=0; for(int j=1;j<=n;j++) { if(t[i][j]==0) { fl=1; break; } } if(!fl) { for(int j=1;j<=n;j++) t[i][j]=0; } } for(int j=1;j<=n;j++) { bool fl=0; for(int i=1;i<=n;i++) { if(t[i][j]==0) { fl=1; break; } } if(!fl) { for(int i=1;i<=n;i++) t[i][j]=0; } } } int rows[MAXN]; int cols[MAXN]; int val[MAXN][MAXN]; int val1[MAXN][MAXN]; vector > ord; bool cmp(pair a,pair b) { //if(val[a.fi][a.se]==val[b.fi][b.se]) return aval[b.fi][b.se]; } void initOrd() { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { ord.push_back({i,j}); } } } int getVal(int x,int y) { int ret=0; for(auto [dx,dy]: bl[ind][rot]) { int curx=x+dx; int cury=y+dy; if(curx<1 || curx>n || cury<1 || cury>n) return 0; if(t[curx][cury]==1) return 0; ret+=val1[curx][cury]; } return ret; } void getOrder() { for(int i=1;i<=n;i++) { rows[i]=n; for(int j=1;j<=n;j++) if(t[i][j]==0) rows[i]--; rows[i]=rows[i]*rows[i]; } for(int j=1;j<=n;j++) { cols[j]=n; for(int i=1;i<=n;i++) if(t[i][j]==0) cols[j]--; cols[j]=cols[j]*cols[j]; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { val1[i][j]=rows[i]+cols[j]; } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { val[i][j]=getVal(i,j); //val[i][j]=1*(val1[i][j]+val1[i-1][j]+val1[i][j+1]+val1[i+1][j]+val1[i][j-1])+ // 1*(val1[i-1][j-1]+val1[i-1][j+1]+val1[i+1][j+1]+val1[i+1][j-1]); } } sort(ord.begin(), ord.end(), cmp); } void getBlock() { typeB=(typeB^x1)+_y1; rotB=(rotB^x2)+y2; ind=typeB%5; rot=rotB%4; } void initBlocks() { bl[0][0]={{0,0}, {-1, 0}, {0,-1}, {-1,-1}}; bl[0][1]={{0,0}, {-1, 0}, {0,1}, {-1,1}}; bl[0][2]={{0,0}, {1, 0}, {0,1}, {1,1}}; bl[0][3]={{0,0}, {1, 0}, {0,-1}, {1,-1}}; bl[1][0]={{0,0}, {-1, 0}, {0,-1}}; bl[1][1]={{0,0}, {-1, 0}, {0,1}}; bl[1][2]={{0,0}, {1, 0}, {0,1}}; bl[1][3]={{0,0}, {1, 0}, {0,-1}}; bl[2][0]={{0,0}, {-1, 0}, {0,-1}, {0,-2}}; bl[2][1]={{0,0}, {-1, 0}, {-2,0}, {0,1}}; bl[2][2]={{0,0}, {1, 0}, {0,1}, {0,2}}; bl[2][3]={{0,0}, {1, 0}, {2,0}, {0,-1}}; bl[3][0]={{0,0}, {0, -1}, {0,-2}, {0,-3}}; bl[3][1]={{0,0}, {-1, 0}, {-2,0}, {-3,0}}; bl[3][2]={{0,0}, {0, 1}, {0,2}, {0,3}}; bl[3][3]={{0,0}, {1, 0}, {2,0}, {3,0}}; bl[4][0]={{0,0}, {-1, 0}, {-2,0}, {-1,-1}}; bl[4][1]={{0,0}, {-1, 1}, {0,1}, {0,2}}; bl[4][2]={{0,0}, {1, 0}, {1,1}, {2,0}}; bl[4][3]={{0,0}, {0, -1}, {1,-1}, {0,-2}}; } signed main() { fastIO(); fileInOut(); initClock(); cin>>n>>x1>>_y1>>typeB>>x2>>y2>>rotB; initBlocks(); initOrd(); /*for(int i=0;i<5;i++) { for(int j=0;j<4;j++) { for(auto [dx,dy]: bl[i][j]) cout<<"("<TIME_LIMIT) break; getBlock(); getOrder(); bool fl=0; for(auto [i,j]: ord) { if(ok(i,j)) { place(i,j); fl=1; break; } } if(!fl) break; clearLines(); } cout<