#include <bits/stdc++.h>
using namespace std;
const int N = (1 << 20) + 7;
long long n, m, mod;
int a[25], c[N];
long long f[N], g[N];
long long qread() {
  long long x = 0;
  char ch = getchar();
  while (ch < '0' || ch > '9') ch = getchar();
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x;
}
void FWT(long long *a, int lim) {
  for (int i = 2; i <= lim; i <<= 1)
    for (int mid = i >> 1, j = 0; j < lim; j += i)
      for (int k = j; k < j + mid; k++) {
        long long t = a[k + mid];
        a[k + mid] = a[k] - t;
        if (a[k + mid] < 0) a[k + mid] += mod;
        a[k] = a[k] + t;
        if (a[k] >= mod) a[k] -= mod;
      }
}
long long Mul(long long a, long long b) {
  long long res = a * b - (long long)((double)a / mod * b + 1e-3) * mod;
  return res < 0 ? res + mod : res;
}
long long Fpow(long long b, long long p) {
  long long res = 1;
  for (; p; p >>= 1, b = Mul(b, b))
    if (p & 1) res = Mul(res, b);
  return res;
}
int main() {
  m = qread();
  n = qread();
  mod = qread() << m;
  int lim = 1 << m;
  for (int i = 0; i < lim; i++) f[i] = qread();
  for (int i = 0; i <= m; i++) a[i] = qread();
  g[0] = a[0];
  for (int i = 1; i < lim; i++) c[i] = c[i - (i & -i)] + 1, g[i] = a[c[i]];
  FWT(f, lim);
  FWT(g, lim);
  for (int i = 0; i < lim; i++) f[i] = Mul(f[i], Fpow(g[i], n));
  FWT(f, lim);
  for (int i = 0; i < lim; i++) printf("%d\n", f[i] >> m);
  return 0;
}
