#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  long long a = 0;
  char c = getchar();
  while (!isdigit(c)) c = getchar();
  while (isdigit(c)) {
    a = a * 10 + c - 48;
    c = getchar();
  }
  return a;
}
const long long MAXN = (1 << 20) + 7;
long long E[MAXN], trans[MAXN], B[21], N, M, T, MOD, phi;
void getPhi() {
  phi = MOD;
  long long tmp = MOD;
  for (long long i = 2; i * i <= tmp; ++i)
    if (tmp % i == 0) {
      phi = phi / i * (i - 1);
      while (tmp % i == 0) tmp /= i;
    }
  if (tmp - 1) phi = phi / tmp * (tmp - 1);
}
long long mul(unsigned long long x, unsigned long long y) {
  long long sum = x * y - (long long)((long double)x / MOD * y + 0.5) * MOD;
  if (sum < 0) sum += MOD;
  return sum;
}
long long poww(long long a, long long b) {
  long long times = 1;
  if (b > phi) b = b % phi + phi;
  while (b) {
    if (b & 1) times = mul(times, a);
    a = mul(a, a);
    b >>= 1;
  }
  return times;
}
void FWT(long long *arr) {
  for (long long i = 1; i < N; i <<= 1)
    for (long long j = 0; j < N; j += i << 1)
      for (long long k = 0; k < i; ++k) {
        long long x = arr[j + k], y = arr[i + j + k];
        arr[j + k] = x + y >= MOD ? x + y - MOD : x + y;
        arr[i + j + k] = x - y < 0 ? x - y + MOD : x - y;
      }
}
long long popcount(long long x) {
  long long cnt = 0;
  while (x) {
    cnt += x & 1;
    x >>= 1;
  }
  return cnt;
}
signed main() {
  M = read();
  N = 1 << M;
  T = read();
  MOD = read() * N;
  getPhi();
  for (long long i = 0; i < N; ++i) E[i] = read() % MOD;
  for (long long i = 0; i <= M; ++i) B[i] = read() % MOD;
  for (long long i = 0; i < N; ++i) trans[i] = B[popcount(i)];
  FWT(E);
  FWT(trans);
  for (long long i = 0; i < N; ++i) E[i] = mul(E[i], poww(trans[i], T));
  FWT(E);
  for (long long i = 0; i < N; ++i) printf("%I64d\n", E[i] / N);
  return 0;
}
