import sys def readints(): return list(map(int, sys.stdin.readline().split())) def fwht(a, n): size = 1 << n h = 1 while h < size: for i in range(0, size, h * 2): for j in range(i, i + h): x = a[j] y = a[j + h] a[j] = x + y a[j + h] = x - y h *= 2 def inverse_fwht(a, n): size = 1 << n h = 1 while h < size: for i in range(0, size, h * 2): for j in range(i, i + h): x = a[j] y = a[j + h] a[j] = (x + y) // 2 a[j + h] = (x - y) // 2 h *= 2 def main(): n = int(sys.stdin.readline()) size = 1 << n # Read A A = [] for _ in range(size): bits = list(map(int, sys.stdin.readline().split())) val = 0 for i in range(32): if bits[i]: val |= 1 << i A.append(val) # Read B B = [] for _ in range(size): bits = list(map(int, sys.stdin.readline().split())) val = 0 for i in range(32): if bits[i]: val |= 1 << i B.append(val) # Preprocess A_m and B_n a_m = [] for m in range(32): tmp = [0] * size for i in range(size): tmp[i] = (A[i] >> m) & 1 a_m.append(tmp.copy()) fwht(a_m[m], n) b_n = [] for m in range(32): tmp = [0] * size for i in range(size): tmp[i] = (B[i] >> m) & 1 b_n.append(tmp.copy()) fwht(b_n[m], n) C = [0] * size for m in range(32): for m_prime in range(32): l = m + m_prime if l >= 63: continue product = [a_m[m][i] * b_n[m_prime][i] for i in range(size)] # Inverse FWHT inverse_fwht(product, n) for k in range(size): bit = (product[k] % 2 + 2) % 2 if bit: C[k] ^= (1 << l) # Output the result for k in range(size): output = [0] * 63 for l in range(63): output[l] = (C[k] >> l) & 1 print(' '.join(map(str, output))) if __name__ == '__main__': main()