#include <bits/stdc++.h>
using namespace std;
const int N = 1 << 20 | 1;
int gi() {
  int w = 0;
  bool q = 1;
  char c = getchar();
  while ((c < '0' || c > '9') && c != '-') c = getchar();
  if (c == '-') q = 0, c = getchar();
  while (c >= '0' && c <= '9') w = w * 10 + c - '0', c = getchar();
  return q ? w : -w;
}
short siz[N];
long long a[N], b[N], mod;
inline void FWT(long long *a, int n) {
  int i, o, k;
  long long x, y;
  for (i = 1; i < n; i <<= 1)
    for (o = 0; o < n; o += i << 1)
      for (k = 0; k < i; k++) {
        x = a[o + k], y = a[o + k + i];
        a[o + k] = (x + y) % mod;
        a[o + k + i] = (x - y + mod) % mod;
      }
}
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 qpow(long long x, long long y) {
  long long ans = 1;
  while (y) {
    if (y & 1) ans = mul(ans, x);
    x = mul(x, x);
    y >>= 1;
  }
  return ans;
}
int main() {
  int m = gi(), n = 1 << m, i, f[21] = {};
  long long y;
  cin >> y;
  mod = 1LL * gi() * n;
  for (i = 0; i < n; i++) a[i] = gi();
  for (i = 0; i <= m; i++) f[i] = gi();
  for (i = 0; i < n; i++) b[i] = f[siz[i] = siz[i >> 1] + (i & 1)];
  FWT(a, n);
  FWT(b, n);
  for (i = 0; i < n; i++) a[i] = mul(a[i], qpow(b[i], y));
  FWT(a, n);
  for (i = 0; i < n; i++) printf("%d\n", int(a[i] / n));
  return 0;
}
