#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
inline long long readll() {
  long long x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10ll + ch - '0';
    ch = getchar();
  }
  return x * f;
}
long long MOD;
inline long long mul(long long x, long long y) {
  return (x * y - (long long)((long double)x * y / MOD) * MOD + MOD) % MOD;
}
long long f[1500005], g[1500005];
void FWT_xor(long long *f, int n, int opr) {
  int m = (1 << n);
  for (int i = 2; i <= m; i <<= 1) {
    for (int p = i >> 1, j = 0; j < m; j += i) {
      for (int k = j; k < j + p; ++k) {
        long long x = f[k], y = f[k + p];
        f[k] = (x + y) % MOD, f[k + p] = (x - y + MOD) % MOD;
      }
    }
  }
  if (opr == -1) {
    for (int i = 0; i < (1 << n); ++i) f[i] /= (1ll << n);
  }
}
long long b[1500005], e[1500005];
void Mul(long long *A, long long *B, int len) {
  for (int i = 0; i < len; ++i) {
    A[i] = mul(A[i], B[i]);
  }
}
int main() {
  int m = read();
  long long t = readll();
  int p = read();
  int n = (1 << m);
  MOD = 1ll * p * n;
  for (int i = 0; i < n; ++i) e[i] = readll();
  for (int i = 0; i <= m; ++i) b[i] = readll();
  for (int i = 0; i < n; ++i) g[i] = b[__builtin_popcount(i)];
  FWT_xor(e, m, 1), FWT_xor(g, m, 1);
  while (t) {
    if (t & 1ll) Mul(e, g, n);
    Mul(g, g, n);
    t >>= 1ll;
  }
  FWT_xor(e, m, -1);
  for (int i = 0; i < n; ++i) {
    printf("%lld\n", e[i]);
  }
  return 0;
}
