//#pragma GCC optimize("O3") #include using namespace std; #define ll long long #define rep(i,n) for (ll i=0;i<(ll)n;i++) #define rrep(i,n) for (ll i=(n)-1;i>=(ll)0;i--) #define loop(i,m,n) for(ll i=m;i<=(ll)n;i++) #define rloop(i,m,n) for(ll i=m;i>=(ll)n;i--) #define vl vector #define vvl vector #define vvvl vector #define vdbg(a) rep(ii,a.size()){cout< //#define bbi boost::multiprecision::cpp_int //#include //整数同士の累乗の計算をする。 ll power(ll A, ll B) { ll result = 1; for (ll i=0;i 0){ if ((k&1) ==1)ans=(ans*n)%mod; n=n*n%mod; k >>= 1; } return ans; } //受け取った2次元文字の外側に、文字pをコーティングする。 vector pad(vector &s,char p){ ll h=s.size(); ll w=s[0].size(); vector res(h+2,string(w+2,p)); rep(i,h)rep(j,w)res[i+1][j+1]=s[i][j]; return res; } // Union-Find struct UnionFind { vector par, siz; UnionFind(int n) : par(n, -1) , siz(n, 1) { } // 根を求める int root(int x) { if (par[x] == -1) return x; else return par[x] = root(par[x]); } // x と y が同じグループに属するかどうか (根が一致するかどうか) bool issame(int x, int y) { return root(x) == root(y); } // x を含むグループと y を含むグループとを併合する bool unite(int x, int y) { x = root(x), y = root(y); if (x == y) return false; if (siz[x] < siz[y]) swap(x, y); par[y] = x; siz[x] += siz[y]; return true; } // x を含むグループのサイズ int size(int x) { return siz[root(x)]; } }; //グリッド問題等用 vl dx={1,0,-1,0}; vl dy={0,1,0,-1}; void solve(){ ll n; cin>>n; vl x(n),y(n),z(n+n-1); //横ANDがX,縦ORがY,左下→右上向き斜めXORがZ rep(i,n)cin>>x[i]; rep(i,n)cin>>y[i]; rep(i,n+n-1)cin>>z[i]; vvl ans(n,vl(n,0)); rep(b,30){ vl xx=x,yy=y,zz=z; vl xcnt=x,ycnt=y,zcnt=z; rep(i,n){ xx[i]=(xx[i]>>b)%2; yy[i]=(yy[i]>>b)%2; xcnt[i]=n; ycnt[i]=n; } rep(i,n+n-1){ zz[i]=(zz[i]>>b)%2; zcnt[i]=min(i+1,n+n-i-1); } vvl tmp(n,vl(n,-1)); ll type=2; rep(i,n){ if(xx[i]==1){ if(type==1){ cout<<-1<=4のみ解く。 tmp[0][1]=0; tmp[1][1]=0; tmp[n-2][1]=1; tmp[n-2][0]=1; zz[n-2]^=1; zz[n-1]^=1; zcnt[1]--; zcnt[2]--; zcnt[n-2]--; zcnt[n-1]--; loop(i,2,n-1){ tmp[1][i]=1; zz[1+i]^=1; zcnt[1+i]--; tmp[i][n-2]=0; zcnt[n-2+i]--; } //XORを調整する。 rep(i,n)rep(j,n){ if(tmp[i][j]==-1){ tmp[i][j]=zz[i+j]; zz[i+j]=0; } } }else{ if(type==0){ rep(i,n)rep(j,n){ if(tmp[i][j]==-1&&zcnt[i+j]>=2){ tmp[i][j]=0; xcnt[i]--; zcnt[i+j]--; } } }else{ rep(j,n)rep(i,n){ if(tmp[i][j]==-1&&zcnt[i+j]>=2){ tmp[i][j]=1; zz[i+j]^=1; ycnt[j]--; zcnt[i+j]--; } } } //zcnt埋めが終わった奴をチェック rep(i,n+n-1){ if(zcnt[i]==0){ if(zz[i]==1){ cout<<-1<>t; rep(i,t)solve(); }