Problem:


Score : 600 points

Problem Statement

Given are an integer N and arrays S, T, U, and V, each of length N.
Construct an N×N matrix a that satisfy the following conditions:

a_{i,j} is an integer.

0 \leq a_{i,j}  \lt 2^{64}.

If S_{i} = 0, the bitwise AND of the elements in the i-th row is U_{i}.

If S_{i} = 1, the bitwise OR of the elements in the i-th row is U_{i}.

If T_{i} = 0, the bitwise AND of the elements in the i-th column is V_{i}.

If T_{i} = 1, the bitwise OR of the elements in the i-th column is V_{i}.

However, there may be cases where no matrix satisfies the conditions.

Constraints

All values in input are integers.

 1 \leq N \leq 500 

 0 \leq S_{i} \leq 1 

 0 \leq T_{i} \leq 1  

 0 \leq U_{i} \lt 2^{64}  

 0 \leq V_{i} \lt 2^{64}  

Input

Input is given from Standard Input in the following format:

N
S_{1} S_{2} ...  S_{N}
T_{1} T_{2} ...  T_{N}
U_{1} U_{2} ...  U_{N}
V_{1} V_{2} ...  V_{N}

Output

If there exists a matrix that satisfies the conditions, print one such matrix in the following format:

a_{1,1} ...  a_{1,N}
:
a_{N,1} ...  a_{N,N}

Note that any matrix satisfying the conditions is accepted.

If no matrix satisfies the conditions, print -1.

Sample Input 1

2
0 1
1 0
1 1
1 0

Sample Output 1

1 1
1 0

In Sample Input 1, we need to find a matrix such that:

the bitwise AND of the elements in the 1-st row is 1;

the bitwise OR of the elements in the 2-nd row is 1;

the bitwise OR of the elements in the 1-st column is 1;

the bitwise AND of the elements in the 2-nd column is 0.

Sample Input 2

2
1 1
1 0
15 15
15 11

Sample Output 2

15 11
15 11



Sample input:
2
0 1
1 0
1 1
1 0


Sample output:
1 1
1 0

Submission status: Wrong Answer

Solution code:
n = int(input())
slist = list(map(int,input().split()))
tlist = list(map(int,input().split()))
ulist = list(map(int,input().split()))
vlist = list(map(int,input().split()))

def int_to_64bit(n):
    s = ""
    while n > 0:
        bit = n%2
        s = str(bit) + s
        n = n >> 1
    if len(s) < 64:
        s = "0"*(64-len(s))+ s

    return s

matrix = [0 for _ in range(n)]
ones_column = [0 for _ in range(n)]
for i in range(n):
    ulist[i] = int_to_64bit(ulist[i])
    vlist[i] = int_to_64bit(vlist[i])

    matrix[i] = [[] for _ in range(n)]
    for j in range(n):
        matrix[i][j] = ["-1"]*64

ndet_list = []

#Aijk i=row,j=column,k=bit
for i in range(n):
    u = ulist[i]
    for j in range(n):
        v = vlist[j]
        for off in range(len(u)):
            prev = matrix[i][j][off]
            if u[off] == "0" and slist[i] == 1:
                matrix[i][j][off] = "0"
            if u[off] == "1" and slist[i] == 0:
                matrix[i][j][off] = "1"
            if v[off] == "0" and tlist[j] == 1:
                matrix[i][j][off] = "0"
            if v[off] == "1" and tlist[j] == 0:
                matrix[i][j][off] = "1"
            if u[off] == v[off]:
                matrix[i][j][off] = u[off]


            after = matrix[i][j][off]
            if prev != "-1" and prev != after:
                print(-1)
                exit()
            if after == "-1":
                ndet_list.append([i,j,off])
            elif after == "1":
                ones_column[j] += 1


while ndet_list != []:
    nd = ndet_list.pop()
    i = nd[0]
    j = nd[1]
    k = nd[2]
    u = ulist[i]
    v = vlist[j]
    if matrix[i][j][k] == "-1":
        if slist[i] == 0 and u[k] == "0":
            matrix[i][j][k] = "0"
        if slist[i] == 1 and u[k] == "1":
            if (matrix[i][j]).count("1") < n:
                matrix[i][j][k] = "1"
                ones_column[j] += 1
            else:
                matrix[i][j][k] = "0"
        if tlist[j] == 0 and v[k] == "0":
            matrix[i][j][k] = "0"
        if tlist[j] == 1 and v[k] == "1":
            if ones_column[j] < n:
                matrix[i][j][k] = "1"
                ones_column[j] += 1
            else:
                matrix[i][j][k] = "0"

for i in range(n):
    for j in range(n):
        if (matrix[i][j]).count("-1") > 0:
            print(-1)
            exit()
        matrix[i][j] = int("".join(matrix[i][j]),base=2)
    print(*matrix[i],sep=" ")

Submission status: Wrong Answer

Solution code:
n = int(input())
slist = list(map(int,input().split()))
tlist = list(map(int,input().split()))
ulist = list(map(int,input().split()))
vlist = list(map(int,input().split()))

def int_to_64bit(n):
    s = ""
    while n > 0:
        bit = n%2
        s = str(bit) + s
        n = n >> 1
    if len(s) < 64:
        s = "0"*(64-len(s))+ s

    return s

matrix = [0 for _ in range(n)]
for i in range(n):
    ulist[i] = int_to_64bit(ulist[i])
    vlist[i] = int_to_64bit(vlist[i])

    matrix[i] = [[] for _ in range(n)]
    for j in range(n):
        matrix[i][j] = ["-1"]*64

ndet_list = []

#Aijk i=row,j=column,k=bit
for i in range(n):
    u = ulist[i]
    for j in range(n):
        v = vlist[j]
        for off in range(len(u)):
            prev = matrix[i][j][off]
            if u[off] == "0" and slist[i] == 1:
                matrix[i][j][off] = "0"
            if u[off] == "1" and slist[i] == 0:
                matrix[i][j][off] = "1"
            if v[off] == "0" and tlist[j] == 1:
                matrix[i][j][off] = "0"
            if v[off] == "1" and tlist[j] == 0:
                matrix[i][j][off] = "1"
            if u[off] == v[off]:
                matrix[i][j][off] = u[off]

            after = matrix[i][j][off]
            if prev != "-1" and prev != after:
                print(-1)
                exit()
            if after == "-1":
                ndet_list.append([i,j,off])


while ndet_list != []:
    nd = ndet_list.pop()
    i = nd[0]
    j = nd[1]
    k = nd[2]
    u = ulist[i]
    v = vlist[j]
    if matrix[i][j][k] == "-1":
        if slist[i] == 0 and u[k] == "0":
            matrix[i][j][k] = "0"
        if slist[i] == 1 and u[k] == "1":
            if (matrix[i][j]).count("1") < n:
                matrix[i][j][k] = "1"
            else:
                matrix[i][j][k] = "0"
        if tlist[j] == 0 and v[k] == "0":
            matrix[i][j][k] = "0"
        if tlist[j] == 1 and v[k] == "1":
            count = 0
            for o in range(n):
                if matrix[o][j] == "1":
                    count+=1
            if count < n:
                matrix[i][j][k] = "1"
            else:
                matrix[i][j][k] = "0"

for i in range(n):
    for j in range(n):
        if (matrix[i][j]).count("-1") > 0:
            print(-1)
            exit()
        matrix[i][j] = int("".join(matrix[i][j]),base=2)
    print(*matrix[i],sep=" ")

Submission status: Wrong Answer

Solution code:
n = int(input())
slist = list(map(int,input().split()))
tlist = list(map(int,input().split()))
ulist = list(map(int,input().split()))
vlist = list(map(int,input().split()))

matrix = [0 for _ in range(n)]
for i in range(n):
    matrix[i] = [[] for _ in range(n)]
    for j in range(n):
        matrix[i][j] = ["-1"]*64

def int_to_64bit(n):
    s = ""
    while n > 0:
        bit = n%2
        s = str(bit) + s
        n = n >> 1
    if len(s) < 64:
        s = "0"*(64-len(s))+ s

    return s

#Aijk i=row,j=column,k=bit
for i in range(n):
    u = int_to_64bit(ulist[i])
    for j in range(n):
        v = int_to_64bit(vlist[j])
        for off in range(len(u)):
            prev = matrix[i][j][off]
            if u[off] == "0" and slist[i] == 1:
                matrix[i][j][off] = "0"
            if u[off] == "1" and slist[i] == 0:
                matrix[i][j][off] = "1"
            if v[off] == "0" and tlist[j] == 1:
                matrix[i][j][off] = "0"
            if v[off] == "1" and tlist[j] == 0:
                matrix[i][j][off] = "1"
            if u[off] == v[off]:
                matrix[i][j][off] = u[off]

            after = matrix[i][j][off]
            if prev != "-1" and prev != after:
                print(-1)
                exit()

for i in range(n):
    u = int_to_64bit(ulist[i])
    for j in range(n):
        v = int_to_64bit(vlist[j])
        for k in range(64):
            if matrix[i][j][k] == "-1":
                if slist[i] == 0 and u[k] == "0":
                    matrix[i][j][k] = "0"
                if slist[i] == 1 and u[k] == "1":
                    if (matrix[i][j]).count("1") < n:
                        matrix[i][j][off] = "1"
                    else:
                        matrix[i][j][k] = "0"
                if tlist[j] == 0 and v[k] == "0":
                    matrix[i][j][k] = "0"
                if tlist[j] == 1 and v[k] == "1":
                    count = 0
                    for o in range(n):
                        if matrix[o][j] == "1":
                            count+=1
                    if count < n:
                        matrix[i][j][k] = "1"
                    else:
                        matrix[i][j][k] = "0"

for i in range(n):
    for j in range(n):
        if (matrix[i][j]).count("-1") > 0:
            print(-1)
            exit()
        matrix[i][j] = int("".join(matrix[i][j]),base=2)
    print(*matrix[i],sep=" ")

Submission status: Wrong Answer

Solution code:
import sys
input = lambda : sys.stdin.readline().rstrip()
sys.setrecursionlimit(max(1000, 10**9))
write = lambda x: sys.stdout.write(x+"\n")



n = int(input())
s = list(map(int, input().split()))
t = list(map(int, input().split()))
u = list(map(int, input().split()))
v = list(map(int, input().split()))
from collections import defaultdict

def sub(s,t,u,v,n):
    vals = [[None]*n for _ in range(n)]
    d = {(0,0): "0?", (0,1): "1", (1,0): "0", (1,1): "1?"}
    d2 = {("1", "1"): 1,
        ("0", "0"): 0,
        ("1?", "1?"): 1,
        ("0?", "0?"): 0,

        ("0?", "0"): 0,
        ("0", "0?"): 0,
        ("1", "1?"): 1,
        ("1?", "1"): 1,
        
        ("1", "0"): None,
        ("0", "1"): None,

        ("1?", "0"): 0,
        ("0", "1?"): 0,
        ("0?", "1"): 1,
        ("1", "0?"): 1,

        ("1?", "0?"): "10", # vals[i][:]に1が, vals[:][j]に0が必要な箇所
        ("0?", "1?"): "01", # vals[i][:]に0が, vals[:][j]に1が必要な箇所
    }
    zr = [0] * n
    zc = [0] * n
    index = []
    rdone = set()
    cdone = set()
    
    for i in range(n):
        for j in range(n):
            v1 = d[s[i],u[i]]
            v2 = d[t[j],v[j]]
            vv = d2[v1,v2]
            vals[i][j] = vv
            if vv is None:
                return -1
            elif vv==0:
                zr[i] += 1
                zc[j] += 1
            elif vv==1:
                rdone.add(i)
                cdone.add(j)
            elif type(vv)==str:
                index.append((i,j,vv))

    # "10", "01"を処理
    for i,j,vv in index:
        if vv=="10":
            if i not in rdone and zc[j]>=2:
                vals[i][j] = 1
                zc[j] -= 1
                rdone.add(i)
            elif i in rdone:
                vals[i][j] = 0
            else:
                return -1
        if vv=="01":
            if j not in cdone and zr[i]>=2:
                vals[i][j] = 1
                zr[i] -= 1
                cdone.add(j)
            elif j in cdone:
                vals[i][j] = 0
            else:
                return -1
    return vals


ans = []
val = [[0]*n for _ in range(n)]
for i in range(64):
    ss = [item>>i&1 for item in s]
    tt = [item>>i&1 for item in t]
    uu = [item>>i&1 for item in u]
    vv = [item>>i&1 for item in v]
    res = sub(ss,tt,uu,vv,n)
    if res==-1:
        ans = -1
        break
    else:
        for ii in range(n):
            for jj in range(n):
                val[ii][jj] += res[ii][jj]*(1<<i)
if ans!=-1:
    for i in range(n):
        write(" ".join(map(str, val[i])))
else:
    print(-1)

Submission status: Wrong Answer

Solution code:
import numpy as np

N = int(input())

S = list(map(int,input().split()))
T = list(map(int,input().split()))
U = np.array(list(map(int,input().split())),dtype = np.uint64)
V = np.array(list(map(int,input().split())),dtype = np.uint64)

ans = np.zeros((N,N),dtype = np.uint64)

for n in range(64):
  u = (U>>n)&1
  v = (V>>n)&1
  su = [int(S[i]*2+u[i]) for i in range(N)]
  tv = [int(T[i]*2+v[i]) for i in range(N)]
  suzerozero = []
  suoneone = []
  tvzerozero = []
  tvoneone = []
  for i in range(N):
    if su[i] == 0:
      suzerozero.append(i)
    if su[i] == 3:
      suoneone.append(i)
  for i in range(N):
    if tv[i] == 0:
      tvzerozero.append(i)
    if tv[i] == 3:
      tvoneone.append(i)
  
  b = np.zeros((N,N),dtype = np.uint64)
  ###行のAND=1とOR=0を埋める###
  for i in range(N):
    if su[i] == 1:
      b[i] = np.ones(N,int)
  ###列のAND=1とOR=0を埋める###
  for i in range(N):
    if tv[i] == 1:
      b[:,i] = np.ones(N,int)
  ###行と列の値が一致するところを埋める###  
  b |= np.dot(np.array([u]).T,np.ones((1,N),dtype = np.uint64)) & np.dot(np.array([v]).T,np.ones((1,N),dtype = np.uint64)).T
  ###行のOR=1を満たしていく### 
  if 1 not in tv and 3 not in tv:
    m = len(tvzerozero)
    now = 0
    for i in suoneone:
      b[i][tvzerozero[now%m]] += 1
      now += 1
  ###列のOR=1を満たしていく### 
  if 1 not in su and 3 not in su:
    m = len(suzerozero)
    now = 0
    for i in tvoneone:
      b[suzerozero[now%m]][i] += 1
      now += 1
  ans += b<<n
print(ans)
def end():
  print(-1)
  exit()
for i in range(N):
  if S[i] == 0:
    now = ans[i][0]
    for j in range(1,N):
      now &= ans[i][j]
  if S[i] == 1:
    now = ans[i][0]
    for j in range(1,N):
      now |= ans[i][j]
  if now != U[i]:
    end()
for i in range(N):
  if T[i] == 0:
    now = ans[0][i]
    for j in range(1,N):
      now &= ans[j][i]
  if T[i] == 1:
    now = ans[0][i]
    for j in range(1,N):
      now |= ans[j][i]
  if now != V[i]:
    end()

for item in ans:
  print(*list(item))

Submission status: Wrong Answer

Solution code:
import numpy as np

N = int(input())

S = list(map(int,input().split()))
T = list(map(int,input().split()))
U = np.array(list(map(int,input().split())),dtype = np.uint64)
V = np.array(list(map(int,input().split())),dtype = np.uint64)

ans = np.zeros((N,N),dtype = np.uint64)

for n in range(64):
  u = (U>>n)&1
  v = (V>>n)&1
  su = [int(S[i]*2+u[i]) for i in range(N)]
  tv = [int(T[i]*2+v[i]) for i in range(N)]
  suzerozero = []
  suoneone = []
  tvzerozero = []
  tvoneone = []
  for i in range(N):
    if su[i] == 0:
      suzerozero.append(i)
    if su[i] == 3:
      suoneone.append(i)
  for i in range(N):
    if tv[i] == 0:
      tvzerozero.append(i)
    if tv[i] == 3:
      tvoneone.append(i)
  
  b = np.zeros((N,N),dtype = np.uint64)
  ###行のAND=1とOR=0を埋める###
  for i in range(N):
    if su[i] == 1:
      b[i] = np.ones(N,int)
  ###列のAND=1とOR=0を埋める###
  for i in range(N):
    if tv[i] == 1:
      b[:,i] = np.ones(N,int)
  ###行と列の値が一致するところを埋める###  
  b |= np.dot(np.array([u]).T,np.ones((1,N),dtype = np.uint64)) & np.dot(np.array([v]).T,np.ones((1,N),dtype = np.uint64)).T

  ###行のOR=1を満たしていく### 
  if 1 not in tv and 3 not in tv:
    m = len(tvzerozero)
    now = 0
    for i in suoneone:
      b[i][now%m] += 1
      now += 1
      
  ###列のOR=1を満たしていく### 
  if 1 not in su and 3 not in su:
    m = len(suzerozero)
    now = 0
    for i in tvoneone:
      b[now%m][i] += 1
      now += 1
  ans += b<<n
  
def end():
  print(-1)
  exit()

for i in range(N):
  if S[i] == 0:
    now = np.uint64(1)
    for j in range(N):
      now &= ans[i][j]
  if S[i] == 1:
    now = np.uint64(0)
    for j in range(N):
      now |= ans[i][j]
  if now != U[i]:
    end()
for i in range(N):
  if T[i] == 0:
    now = np.uint64(1)
    for j in range(N):
      now &= ans[j][i]
  if T[i] == 1:
    now = np.uint64(0)
    for j in range(N):
      now |= ans[j][i]
  if now != V[i]:
    end()

for item in ans:
  print(*list(item))

Submission status: Wrong Answer

Solution code:
import numpy as np

N = int(input())

S = list(map(int,input().split()))
T = list(map(int,input().split()))
U = np.array(list(map(int,input().split())),dtype = np.uint64)
V = np.array(list(map(int,input().split())),dtype = np.uint64)

ans = np.zeros((N,N),dtype = np.uint64)

for n in range(64):
  u = (U>>n)&1
  v = (V>>n)&1
  su = [int(S[i]*2+u[i]) for i in range(N)]
  tv = [int(T[i]*2+v[i]) for i in range(N)]
  suzerozero = []
  suoneone = []
  tvzerozero = []
  tvoneone = []
  for i in range(N):
    if su[i] == 0:
      suzerozero.append(i)
    if su[i] == 3:
      suoneone.append(i)
  for i in range(N):
    if tv[i] == 0:
      tvzerozero.append(i)
    if tv[i] == 3:
      tvoneone.append(i)
  
  b = np.zeros((N,N),dtype = np.uint64)
  ###行のAND=1とOR=0を埋める###
  for i in range(N):
    if su[i] == 1:
      b[i] = np.ones(N,int)
  ###列のAND=1とOR=0を埋める###
  for i in range(N):
    if tv[i] == 1:
      b[:,i] = np.ones(N,int)
  ###行と列の値が一致するところを埋める###  
  b |= np.dot(np.array([u]).T,np.ones((1,N),dtype = np.uint64)) & np.dot(np.array([v]).T,np.ones((1,N),dtype = np.uint64)).T

  ###行のOR=1を満たしていく### 
  if 1 not in tv and 3 not in tv:
    m = len(tvzerozero)
    now = 0
    for i in suoneone:
      b[i][now%m] += 1
      now += 1
      
  ###列のOR=1を満たしていく### 
  if 1 not in su and 3 not in su:
    m = len(suzerozero)
    now = 0
    for i in tvoneone:
      b[now%m][i] += 1
      now += 1
  ans += b<<n
def end():
  print(-1)
  exit()
for i in range(N):
  if S[i] == 0:
    now = ans[i][0]
    for j in range(1,N):
      now &= ans[i][j]
  if S[i] == 1:
    now = ans[i][0]
    for j in range(1,N):
      now |= ans[i][j]
  if now != U[i]:
    end()
for i in range(N):
  if T[i] == 0:
    now = ans[0][i]
    for j in range(1,N):
      now &= ans[j][i]
  if T[i] == 1:
    now = ans[0][i]
    for j in range(1,N):
      now |= ans[j][i]
  if now != V[i]:
    end()

for item in ans:
  print(*list(item))

Submission status: Wrong Answer

Solution code:
import numpy as np

N = int(input())

S = list(map(int,input().split()))
T = list(map(int,input().split()))
U = np.array(list(map(int,input().split())),dtype = np.uint64)
V = np.array(list(map(int,input().split())),dtype = np.uint64)

ans = np.zeros((N,N),dtype = np.uint64)

for n in range(64):
  u = (U>>n)&1
  v = (V>>n)&1
  su = [int(S[i]*2+u[i]) for i in range(N)]
  tv = [int(T[i]*2+v[i]) for i in range(N)]
  suzerozero = []
  suoneone = []
  tvzerozero = []
  tvoneone = []
  for i in range(N):
    if su[i] == 0:
      suzerozero.append(i)
    if su[i] == 3:
      suoneone.append(i)
  for i in range(N):
    if tv[i] == 0:
      tvzerozero.append(i)
    if tv[i] == 3:
      tvoneone.append(i)
  
  b = np.zeros((N,N),dtype = np.uint64)
  ###行のAND=1とOR=0を埋める###
  for i in range(N):
    if su[i] == 1:
      b[i] = np.ones(N,int)
  ###列のAND=1とOR=0を埋める###
  for i in range(N):
    if tv[i] == 1:
      b[:,i] = np.ones(N,int)
  ###行と列の値が一致するところを埋める###  
  b |= np.dot(np.array([u]).T,np.ones((1,N),dtype = np.uint64)) & np.dot(np.array([v]).T,np.ones((1,N),dtype = np.uint64)).T

  ###行のOR=1を満たしていく### 
  if 1 not in tv and 3 not in tv:
    m = len(tvzerozero)
    now = 0
    for i in suoneone:
      b[i][now%m] += 1
      now += 1
      
  ###列のOR=1を満たしていく### 
  if 1 not in su and 3 not in su:
    m = len(suzerozero)
    now = 0
    for i in tvoneone:
      b[now%m][i] += 1
      now += 1
  ans += b<<n

resYOKO = []
resTATE = []
for i in range(N):
  if S[i] == 0:
    now = ans[i][0]
    for j in range(1,N):
      now &= ans[i][j]
    resYOKO.append(now)
  if S[i] == 1:
    now = ans[i][0]
    for j in range(1,N):
      now |= ans[i][j]
    resYOKO.append(now)
for i in range(N):
  if T[i] == 0:
    now = ans[0][i]
    for j in range(1,N):
      now &= ans[j][i]
    resTATE.append(now)
  if T[i] == 1:
    now = ans[0][i]
    for j in range(1,N):
      now |= ans[j][i]
    resTATE.append(now)
if resYOKO != list(U):
  print(-1)
  exit()
if resTATE != list(V):
  print(-1)
  exit()

for item in ans:
  print(*list(item))

Submission status: Wrong Answer

Solution code:
import numpy as np

N = int(input())

S = list(map(int,input().split()))
T = list(map(int,input().split()))
U = np.array(list(map(int,input().split())),dtype = np.uint64)
V = np.array(list(map(int,input().split())),dtype = np.uint64)

ans = np.zeros((N,N),dtype = np.uint64)

for n in range(64):
  u = (U>>n)&1
  v = (V>>n)&1
  su = [int(S[i]*2+u[i]) for i in range(N)]
  tv = [int(T[i]*2+v[i]) for i in range(N)]
  suzerozero = []
  suoneone = []
  tvzerozero = []
  tvoneone = []
  for i in range(N):
    if su[i] == 0:
      suzerozero.append(i)
    if su[i] == 3:
      suoneone.append(i)
  for i in range(N):
    if tv[i] == 0:
      tvzerozero.append(i)
    if su[i] == 3:
      tvoneone.append(i)
  
  b = np.zeros((N,N),dtype = np.uint64)
  ###行のAND=1とOR=0を埋める###
  for i in range(N):
    if su[i] == 1:
      b[i] = np.ones(N,int)
  ###列のAND=1とOR=0を埋める###
  for i in range(N):
    if tv[i] == 1:
      b[:,i] = np.ones(N,int)
  ###行と列の値が一致するところを埋める###  
  b |= np.dot(np.array([u]).T,np.ones((1,N),dtype = np.uint64)) & np.dot(np.array([v]).T,np.ones((1,N),dtype = np.uint64)).T

  ###行のOR=1を満たしていく### 
  if 1 not in tv and 3 not in tv:
    m = len(tvzerozero)
    now = 0
    for i in suoneone:
      b[i][now%m] += 1
      now += 1
      
  ###列のOR=1を満たしていく### 
  if 1 not in su and 3 not in su:
    m = len(suzerozero)
    now = 0
    for i in tvoneone:
      b[now%m][i] += 1
      now += 1
  ans += b<<n

resYOKO = []
resTATE = []
for i in range(N):
  if S[i] == 0:
    now = ans[i][0]
    for j in range(1,N):
      now &= ans[i][j]
    resYOKO.append(now)
  if S[i] == 1:
    now = ans[i][0]
    for j in range(1,N):
      now |= ans[i][j]
    resYOKO.append(now)
for i in range(N):
  if T[i] == 0:
    now = ans[0][i]
    for j in range(1,N):
      now &= ans[j][i]
    resTATE.append(now)
  if T[i] == 1:
    now = ans[0][i]
    for j in range(1,N):
      now |= ans[j][i]
    resTATE.append(now)
if resYOKO != list(U):
  print(-1)
  exit()
if resTATE != list(V):
  print(-1)
  exit()

for item in ans:
  print(*list(item))

Submission status: Wrong Answer

Solution code:
import numpy as np

N = int(input())

S = list(map(int,input().split()))
T = list(map(int,input().split()))
U = np.array(list(map(int,input().split())),dtype = np.uint64)
V = np.array(list(map(int,input().split())),dtype = np.uint64)

ans = np.zeros((N,N),dtype = np.uint64)

for n in range(64):
  u = (U>>n)&1
  v = (V>>n)&1
  su = [int(S[i]*2+u[i]) for i in range(N)]
  tv = [int(T[i]*2+v[i]) for i in range(N)]
  suzerozero = []
  suoneone = []
  tvzerozero = []
  tvoneone = []
  for i in range(N):
    if su[i] == 0:
      suzerozero.append(i)
    if su[i] == 3:
      suoneone.append(i)
  for i in range(N):
    if tv[i] == 0:
      tvzerozero.append(i)
    if su[i] == 3:
      tvoneone.append(i)
  
  b = np.zeros((N,N),dtype = np.uint64)
  ###行のAND=1とOR=0を埋める###
  for i in range(N):
    if su[i] == 1:
      b[i] = np.ones(N,int)
  ###列のAND=1とOR=0を埋める###
  for i in range(N):
    if tv[i] == 1:
      b[:,i] = np.ones(N,int)
  ###行と列の値が一致するところを埋める###  
  b |= np.dot(np.array([u]).T,np.ones((1,N),dtype = np.uint64)) & np.dot(np.array([v]).T,np.ones((1,N),dtype = np.uint64)).T

  ###行のOR=1を満たしていく### 
  if 1 not in tv and 3 not in tv:
    m = len(tvzerozero)
    now = 0
    for i in suoneone:
      b[i][now%m] += 1
      now += 1
      
  ###列のOR=1を満たしていく### 
  if 1 not in su and 3 not in su:
    m = len(suzerozero)
    now = 0
    for i in tvoneone:
      b[now%m][i] += 1
      now += 1
  """


  ###列のOR=1を満たしていく### 
  for i in range(N):
    if T[i] == v[i] == 1 and max(b[:,i]) == 0: #まだ満たされてない列を発見した場合
      pass

      flag = 0 #未解決
      for j in range(N):
        if S[j] == u[j] == b[j][i] == check[j][i] == 0 and sum(b[j]) < N-1:
          b[j][i] = check[j][i] = flag = 1
          break
      if not flag:
        print(-1)
        exit()

  for i in range(N):
    if S[i] == 0 and((u>>i) & 1) == 0:
      if b & mask_gyo[i] == mask_gyo[i]:
        print(-1)
        exit()
    if S[i] == 0 and((u>>i) & 1) == 1:
      if b & mask_gyo[i] != mask_gyo[i]:
        print(-1)
        exit()
    if S[i] == 1 and((u>>i) & 1) == 0:
      if b & mask_gyo[i] != 0:
        print(-1)
        exit()
    if S[i] == 1 and((u>>i) & 1) == 1:
      if b & mask_gyo[i] == 0:
        print(-1)
        exit()
  
  for i in range(N):
    if T[i] == 0 and((v>>i) & 1) == 0:
      if b & mask_retu[i] == mask_retu[i]:
        print(-1)
        exit()
    if T[i] == 0 and((v>>i) & 1) == 1:
      if b & mask_retu[i] != mask_retu[i]:
        print(-1)
        exit()
    if T[i] == 1 and((v>>i) & 1) == 0:
      if b & mask_retu[i] != 0:
        print(-1)
        exit()
    if T[i] == 1 and((v>>i) & 1) == 1:
      if b & mask_retu[i] == 0:
        print(-1)
        exit()

  """
  ans += b<<n


for item in ans:
  print(*list(item))

Submission status: Wrong Answer

Solution code:
import numpy as np

N = int(input())

S = list(map(int,input().split()))
T = list(map(int,input().split()))
U = np.array(list(map(int,input().split())),dtype = np.uint64)
V = np.array(list(map(int,input().split())),dtype = np.uint64)

ans = np.zeros((N,N),dtype = np.uint64)

for n in range(64):
  u = (U>>n)&1
  v = (V>>n)&1
  su = [int(S[i]*2+u[i]) for i in range(N)]
  tv = [int(T[i]*2+v[i]) for i in range(N)]
  YOKOSUM = [0 for i in range(N)]
  TATESUM = [0 for i in range(N)]
  
  b = np.zeros((N,N),dtype = np.uint64)
  ###行のAND=1とOR=0を埋める###
  for i in range(N):
    if su[i] == 1:
      b[i] = np.ones(N,int)
  ###列のAND=1とOR=0を埋める###
  for i in range(N):
    if tv[i] == 1:
      b[:,i] = np.ones(N,int)
  ###行と列の値が一致するところを埋める###  
  b |= np.dot(np.array([u]).T,np.ones((1,N),dtype = np.uint64)) & np.dot(np.array([v]).T,np.ones((1,N),dtype = np.uint64)).T

  """
  for i in range(N):
    if T[i] == v[i] == 0:
      TVzerozerolist.append(i)
  YOKOSUM = [sum(b[i]) for i in range(N)]
  TATESUM = [sum(b[:,i]) for i in range(N)]
  continue
  ###行のOR=1を満たしていく###  
  for i in range(N):
    if S[i] == u[i] == 1 and max(b[i]) == 0: #まだ満たされてない行を発見した場合
      pass

      flag = 0 #未解決
      for j in range(N):
        if T[j] == v[j] == b[i][j] == check[i][j] == 0 and sum(b[:,j]) < N-1:
          b[i][j] = check[i][j] = flag = 1
          break
      if not flag:
        print(-1)
        exit()

  ###列のOR=1を満たしていく### 
  for i in range(N):
    if T[i] == v[i] == 1 and max(b[:,i]) == 0: #まだ満たされてない列を発見した場合
      pass

      flag = 0 #未解決
      for j in range(N):
        if S[j] == u[j] == b[j][i] == check[j][i] == 0 and sum(b[j]) < N-1:
          b[j][i] = check[j][i] = flag = 1
          break
      if not flag:
        print(-1)
        exit()

  for i in range(N):
    if S[i] == 0 and((u>>i) & 1) == 0:
      if b & mask_gyo[i] == mask_gyo[i]:
        print(-1)
        exit()
    if S[i] == 0 and((u>>i) & 1) == 1:
      if b & mask_gyo[i] != mask_gyo[i]:
        print(-1)
        exit()
    if S[i] == 1 and((u>>i) & 1) == 0:
      if b & mask_gyo[i] != 0:
        print(-1)
        exit()
    if S[i] == 1 and((u>>i) & 1) == 1:
      if b & mask_gyo[i] == 0:
        print(-1)
        exit()
  
  for i in range(N):
    if T[i] == 0 and((v>>i) & 1) == 0:
      if b & mask_retu[i] == mask_retu[i]:
        print(-1)
        exit()
    if T[i] == 0 and((v>>i) & 1) == 1:
      if b & mask_retu[i] != mask_retu[i]:
        print(-1)
        exit()
    if T[i] == 1 and((v>>i) & 1) == 0:
      if b & mask_retu[i] != 0:
        print(-1)
        exit()
    if T[i] == 1 and((v>>i) & 1) == 1:
      if b & mask_retu[i] == 0:
        print(-1)
        exit()

  """
  ans += b<<n


for item in ans:
  print(*list(item))

Submission status: Wrong Answer

Solution code:
import numpy as np

N = int(input())

S = np.array(list(map(int,input().split())),dtype = np.uint64)
T = np.array(list(map(int,input().split())),dtype = np.uint64)
U = np.array(list(map(int,input().split())),dtype = np.uint64)
V = np.array(list(map(int,input().split())),dtype = np.uint64)

ans = np.zeros((N,N),dtype = np.uint64)

for n in range(64):
  c = 0
  for i in range(N):
    for j in range(N):
      c += 1
      c += 1
  continue
  
  u = (U>>n)&1
  v = (V>>n)&1
  invu = np.ones(N,dtype = np.uint64)-u
  invv = np.ones(N,dtype = np.uint64)-v
  b = np.zeros((N,N),dtype = np.uint64)
  check = np.zeros((N,N),dtype = np.uint64)
  ###行のAND=1とOR=0を埋める###
  for i in range(N):
    if S[i] != u[i]:
      if u[i] == 1:
        b[i] = np.ones(N,int)
      check[i] = np.ones(N,int)
  ###列のAND=1とOR=0を埋める###
  for i in range(N):
    if T[i] != v[i]:
      if v[i] == 1:
        if max(b[:,i]^check[:,i])!=0:
          print(-1)
          exit()
        b[:,i] = np.ones(N,int)
      if v[i] == 0:
        if max(b[:,i])!=0:
          print(-1)
          exit()
      check[:,i] = np.ones((1,N),int)
  ###行と列の値が一致するところを埋める###  
  same1 = np.dot(np.array([u]).T,np.ones((1,N),dtype = np.uint64)) & np.dot(np.array([v]).T,np.ones((1,N),dtype = np.uint64)).T
  same0 = np.dot(np.array([invu]).T,np.ones((1,N),dtype = np.uint64)) & np.dot(np.array([invv]).T,np.ones((1,N),dtype = np.uint64)).T
  b |= same1
  check |= (same1|same0)

  SUoneonelist = []
  for i in range(N):
    if S[i] == u[i] == 1:
      SUoneonelist.append(i)
  TVoneonelist = []
  for i in range(N):
    if T[i] == v[i] == 1:
      TVoneonelist.append(i)
  SUzerozerolist = []
  for i in range(N):
    if S[i] == u[i] == 0:
      SUzerozerolist.append(i)
  TVzerozerolist = []
  for i in range(N):
    if T[i] == v[i] == 0:
      TVzerozerolist.append(i)
  YOKOSUM = [sum(b[i]) for i in range(N)]
  TATESUM = [sum(b[:,i]) for i in range(N)]
  continue
  ###行のOR=1を満たしていく###  
  for i in range(N):
    if S[i] == u[i] == 1 and max(b[i]) == 0: #まだ満たされてない行を発見した場合
      pass
      """
      flag = 0 #未解決
      for j in range(N):
        if T[j] == v[j] == b[i][j] == check[i][j] == 0 and sum(b[:,j]) < N-1:
          b[i][j] = check[i][j] = flag = 1
          break
      if not flag:
        print(-1)
        exit()
      """
  
  ###列のOR=1を満たしていく### 
  for i in range(N):
    if T[i] == v[i] == 1 and max(b[:,i]) == 0: #まだ満たされてない列を発見した場合
      pass
      """
      flag = 0 #未解決
      for j in range(N):
        if S[j] == u[j] == b[j][i] == check[j][i] == 0 and sum(b[j]) < N-1:
          b[j][i] = check[j][i] = flag = 1
          break
      if not flag:
        print(-1)
        exit()
      """
  """
  for i in range(N):
    if S[i] == 0 and((u>>i) & 1) == 0:
      if b & mask_gyo[i] == mask_gyo[i]:
        print(-1)
        exit()
    if S[i] == 0 and((u>>i) & 1) == 1:
      if b & mask_gyo[i] != mask_gyo[i]:
        print(-1)
        exit()
    if S[i] == 1 and((u>>i) & 1) == 0:
      if b & mask_gyo[i] != 0:
        print(-1)
        exit()
    if S[i] == 1 and((u>>i) & 1) == 1:
      if b & mask_gyo[i] == 0:
        print(-1)
        exit()
  
  for i in range(N):
    if T[i] == 0 and((v>>i) & 1) == 0:
      if b & mask_retu[i] == mask_retu[i]:
        print(-1)
        exit()
    if T[i] == 0 and((v>>i) & 1) == 1:
      if b & mask_retu[i] != mask_retu[i]:
        print(-1)
        exit()
    if T[i] == 1 and((v>>i) & 1) == 0:
      if b & mask_retu[i] != 0:
        print(-1)
        exit()
    if T[i] == 1 and((v>>i) & 1) == 1:
      if b & mask_retu[i] == 0:
        print(-1)
        exit()
  """
  ans += b<<n


for item in ans:
  print(*list(item))