#include <bits/stdc++.h>
using namespace std;
int FWT_mx, dig;
long long p;
inline long long add(long long a, long long b) {
  a += b;
  while (a >= p) a -= p;
  while (a < 0) a += p;
  return a;
}
inline long long mul(long long x, long long y) {
  long long tmp = (x * y - (long long)((long double)x / p * y + 1.0e-8) * p);
  return tmp < 0 ? tmp + p : tmp;
}
inline long long pwr(long long a, long long x) {
  long long ret = 1;
  while (x) {
    if (x & 1) {
      ret = mul(a, ret);
    }
    x >>= 1ll;
    a = mul(a, a);
  }
  return ret;
}
void FWT(long long *a) {
  register int stp, hf, j, k;
  register long long t1, t2;
  for (stp = 2; stp <= FWT_mx; stp <<= 1) {
    hf = stp >> 1;
    for (j = 0; j != FWT_mx; j += stp) {
      for (k = 0; k < hf; ++k) {
        t1 = a[j + k];
        t2 = a[j + k + hf];
        a[j + k] = add(t1, t2);
        a[j + k + hf] = add(t1, -t2);
      }
    }
  }
}
int cst[22];
long long f[1048888], g[1048888], popc[1048888];
int main(void) {
  long long t;
  scanf("%d%I64d%d", &dig, &t, &p);
  p *= (1 << dig);
  FWT_mx = 1 << dig;
  for (int i = 0; i < FWT_mx; ++i) {
    scanf("%d", &f[i]);
  }
  for (int i = 0; i <= dig; ++i) {
    scanf("%d", &cst[i]);
  }
  popc[0] = 0;
  g[0] = cst[0];
  for (int i = 1; i < FWT_mx; ++i) {
    popc[i] = popc[i >> 1] + (i & 1);
    g[i] = cst[popc[i]];
  }
  FWT(f);
  FWT(g);
  for (int i = 0; i < FWT_mx; ++i) {
    f[i] = mul(f[i], pwr(g[i], t));
  }
  FWT(f);
  for (int i = 0; i < FWT_mx; ++i) {
    printf("%d\n", f[i] >> dig);
  }
  return 0;
}
