#include <bits/stdc++.h>
using namespace std;
inline long long rd() {
  long long x = 0, f = 1;
  char c = ' ';
  while (c < '0' || c > '9') f = c == '-' ? -1 : 1, c = getchar();
  while (c <= '9' && c >= '0') x = x * 10 + c - '0', c = getchar();
  return x * f;
}
const long long N = (1 << 20) + 5;
long long m, mod, n, a[N], b[N], str[25], t, inv2;
inline long long mul(long long x, long long y) {
  long long tmp = (x * y - (long long)((long double)x / mod * y + 1e-8) * mod);
  return tmp < 0 ? tmp + mod : tmp;
}
inline long long qpow(long long x, long long k) {
  long long ret = 1;
  while (k) {
    if (k & 1) ret = mul(ret, x);
    x = mul(x, x);
    k >>= 1;
  }
  return ret % mod;
}
inline long long calc(long long x) {
  long long ret = 0;
  while (x) {
    if (x & 1) ++ret;
    x >>= 1;
  }
  return ret;
}
inline void FWT(long long *F, long long type) {
  for (long long mid = 1; mid < n; mid <<= 1)
    for (long long r = mid << 1, j = 0; j < n; j += r)
      for (long long k = 0; k < mid; k++) {
        long long x = F[j + k], y = F[j + mid + k];
        F[j + k] = (x + y) % mod, F[j + mid + k] = (x - y + mod) % mod;
        if (type == -1)
          F[j + k] = F[j + k] >> 1, F[j + mid + k] = F[j + mid + k] >> 1;
      }
}
signed main() {
  m = rd();
  t = rd();
  mod = rd();
  n = 1 << m;
  mod *= n;
  for (long long i = 0; i < n; i++) a[i] = rd() % mod;
  for (long long i = 0; i <= m; i++) str[i] = rd() % mod;
  for (long long i = 0; i < n; i++) b[i] = str[calc(i)];
  FWT(a, 1);
  FWT(b, 1);
  for (long long i = 0; i < n; i++) {
    b[i] = qpow(b[i], t);
    a[i] = mul(a[i], b[i]);
  }
  FWT(a, -1);
  mod /= n;
  for (long long i = 0; i < n; i++) printf("%I64d\n", a[i] % mod);
  return 0;
}
