#include <bits/stdc++.h>
using namespace std;
template <class T>
void read(T& x) {
  T res = 0, f = 1;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (isdigit(c)) {
    res = (res << 3) + (res << 1) + c - '0';
    c = getchar();
  }
  x = res * f;
}
const long long N = (1 << 20) + 10;
long long n, m, limit, mod, t, e[N], b[N], a[N];
long long mul(long long a, long long b) {
  return (a * b - (long long)((long double)a / mod * b) * mod + mod) % mod;
}
void fwt(long long* a, long long n, long long ty) {
  for (long long mid = 1; mid < n; mid <<= 1)
    for (long long l = 0; l < n; l += (mid << 1))
      for (long long i = 0; i < mid; i++) {
        long long x = a[l + i], y = a[l + i + mid];
        a[l + i] = (x + y) % mod;
        a[l + i + mid] = (x - y + mod) % mod;
      }
  if (ty == -1) {
    for (long long i = 0; i < n; i++) a[i] /= n;
  }
}
long long fpow(long long x, long long y) {
  long long ans = 1;
  while (y) {
    if (y & 1) ans = mul(x, ans);
    x = mul(x, x), y >>= 1;
  }
  return ans;
}
int main() {
  read(n), read(t), read(mod);
  limit = (1 << n);
  mod *= limit;
  for (int i = 0; i < (1 << n); i++) read(e[i]);
  for (int i = 0; i <= n; i++) read(b[i]);
  for (int i = 1; i < limit; i++) a[i] = a[i >> 1] + (i & 1);
  for (int i = 0; i < limit; i++) a[i] = b[a[i]];
  fwt(a, limit, 1);
  fwt(e, limit, 1);
  for (int i = 0; i < limit; i++) e[i] = mul(e[i], fpow(a[i], t));
  fwt(e, limit, -1);
  for (int i = 0; i < limit; i++) printf("%lld\n", e[i]);
  return 0;
}
