#include <bits/stdc++.h>
using namespace std;
typedef long long Arr[1048577];
int n, m;
long long T, p, b[22];
Arr A, B;
inline long long mul(long long first, long long second) {
  long long tmp = (first * second -
                   (long long)((long double)first / p * second + 1.0e-8) * p);
  return tmp < 0 ? tmp + p : tmp;
}
inline long long Pow(long long first, long long second) {
  long long z = 1;
  for (; second; second >>= 1, first = mul(first, first))
    if (second & 1) z = mul(z, first);
  return z;
}
inline void FWT(Arr A) {
  for (int i = 1; i < n; i <<= 1)
    for (int j = 0, t = n / (i << 1); j < n; j += i << 1)
      for (int k = 0; k < i; ++k) {
        long long first = A[j + k], &second = A[j + k + i];
        A[j + k] = (first + second) % p;
        second = (first - second + p) % p;
      }
}
int main() {
  scanf("%d%I64d%I64d", &m, &T, &p);
  n = 1 << m;
  p *= n;
  for (int _r = n, i = 0; i < _r; ++i) scanf("%I64d", A + i);
  for (int _r = m, i = 0; i <= _r; ++i) scanf("%I64d", b + i);
  for (int _r = n, i = 0; i < _r; ++i) B[i] = b[__builtin_popcount(i)];
  FWT(A);
  FWT(B);
  for (int _r = m, i = 0; i <= _r; ++i) b[i] = Pow(B[(1 << i) - 1], T);
  for (int _r = n, i = 0; i < _r; ++i) B[i] = b[__builtin_popcount(i)];
  for (int _r = n, i = 0; i < _r; ++i) A[i] = mul(A[i], B[i]);
  FWT(A);
  for (int _r = n, i = 0; i < _r; ++i) A[i] = A[i] / n;
  for (int _r = n, i = 0; i < _r; ++i) printf("%I64d\n", A[i]);
}
