#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  long long x = 0, f = 1;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (isdigit(c)) {
    x = (x << 1) + (x << 3) + (c ^ 48);
    c = getchar();
  }
  return f == 1 ? x : -x;
}
long long mod;
inline long long fix(long long x) { return x + ((x >> 63) & mod); }
inline long long add(long long x, long long y) { return fix(x + y - mod); }
inline long long dec(long long x, long long y) { return fix(x - y); }
inline long long mul(long long x, long long y) {
  return (x * y - (long long)((long double)x / mod * y) * mod + mod) % mod;
}
inline long long ksm(long long x, long long r) {
  long long ret = 1;
  for (long long i = 0; (1ll << i) <= r; i++) {
    if ((r >> i) & 1) ret = mul(ret, x);
    x = mul(x, x);
  }
  return ret;
}
inline void fwt(long long *a, long long len) {
  for (long long mid = 1, u, v; mid < len; mid <<= 1)
    for (long long i = 0; i < len; i += (mid << 1))
      for (long long j = 0; j < mid; j++) {
        u = a[i + j];
        v = a[i + j + mid];
        a[i + j] = add(u, v);
        a[i + j + mid] = dec(u, v);
      }
}
const long long N = (1 << 20) + 10;
long long n, m, t, c[30], a[N], b[N];
signed main() {
  m = read();
  t = read();
  mod = read() << m;
  for (long long i = 0; i < (1 << m); i++) a[i] = read();
  for (long long i = 0; i <= m; i++) c[i] = read();
  for (long long i = 0, cou; i < (1 << m); i++) {
    cou = 0;
    for (long long j = 0; j < m; j++) cou += ((i >> j) & 1);
    b[i] = c[cou];
  }
  fwt(a, 1 << m);
  fwt(b, 1 << m);
  for (long long i = 0; i < (1 << m); i++) a[i] = mul(a[i], ksm(b[i], t));
  fwt(a, 1 << m);
  for (long long i = 0; i < (1 << m); i++) printf("%lld\n", a[i] >> m);
  return (0 - 0);
}
