#include <bits/stdc++.h>
int read() {
  static int ch, x;
  while ((ch = getchar()) < 48) {
  }
  x = ch ^ 48;
  while ((ch = getchar()) >= 48) x = (((x << 2) + x) << 1) + (ch ^ 48);
  return x;
}
long long readll() {
  static int ch;
  static long long x;
  while ((ch = getchar()) < 48) {
  }
  x = ch ^ 48;
  while ((ch = getchar()) >= 48) x = (((x << 2) + x) << 1) + (ch ^ 48);
  return x;
}
const int M = 20;
int b[M + 10];
int cnt[1 << M];
long long f[1 << M], g[1 << M];
inline long long mul(const long long &x, const long long &y,
                     const long long &p) {
  return ((long long)(1ull * x * y -
                      (unsigned long long)(1. * x / p * y + 1e-5) * p) %
              p +
          p) %
         p;
}
inline long long fix(const long long &x, const long long &p) {
  return x + (x >> 63 & p);
}
long long qpow(long long x, long long k, long long p, long long ans = 1) {
  while (k) {
    if (k & 1) ans = mul(ans, x, p);
    x = mul(x, x, p);
    k >>= 1;
  }
  return ans;
}
void fwt(long long *const &a, const int &N, const long long &p) {
  for (int mid = 1, step = 2; mid != N; mid = step, step <<= 1) {
    for (int i = 0; i != N; i += step) {
      for (int j = 0; j != mid; ++j) {
        const long long t = a[i | j | mid];
        a[i | j | mid] = fix(a[i | j] - t, p);
        a[i | j] = fix(a[i | j] + t - p, p);
      }
    }
  }
}
int main() {
  const int m = read(), n = 1 << m;
  const long long t = readll(), p = 1ll * read() << m;
  for (int i = 0; i != n; ++i) f[i] = read() % p;
  for (int i = 0; i <= m; ++i) b[i] = read() % p;
  for (int i = 0; i != n; ++i) {
    cnt[i] = cnt[i >> 1] + (i & 1);
    g[i] = b[cnt[i]];
  }
  fwt(f, n, p);
  fwt(g, n, p);
  for (int i = 0; i != n; ++i) f[i] = qpow(g[i], t, p, f[i]);
  fwt(f, n, p);
  for (int i = 0; i != n; ++i) printf("%u\n", unsigned(f[i] >> m));
  return 0;
}
