#include <bits/stdc++.h>
using namespace std;
const int N = (int)(1e6 + 1e5), M = (int)5e4 + 50;
long long mod;
long long mul(long long a, long long b) {
  long long q = (long long)((long double)a * (long double)b / (long double)mod);
  long long r = a * b - q * mod;
  return (r + mod) % mod;
}
long long add(long long a, long long b) {
  a = (a + b) % mod;
  if (a < 0) a += mod;
  return a;
}
long long fp(long long x, long long k) {
  if (k == 0) return 1;
  long long hf = fp(x, k / 2);
  return k % 2 ? mul(mul(hf, hf), x) : mul(hf, hf);
}
int m;
long long t;
int p;
long long val[N], a[N];
int pw[N], cnt[N];
int b[N];
struct FWT {
  int N;
  void FWTxor(long long *a, int opt) {
    for (int mid = 1; mid < N; mid <<= 1)
      for (int R = mid << 1, j = 0; j < N; j += R)
        for (int k = 0; k < mid; k++) {
          long long x = a[j + k], y = a[j + k + mid];
          a[j + k] = add(x, y), a[j + k + mid] = add(x, -y);
        }
  }
} fwt;
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  pw[0] = 1;
  for (int i = 1; i < N; i++) cnt[i] = cnt[i >> 1] + (i & 1);
  cin >> m >> t >> mod;
  mod <<= m;
  int n = fwt.N = (1 << m);
  for (int i = 0; i < n; i++) cin >> val[i];
  for (int i = 0; i <= m; i++) cin >> b[i];
  for (int i = 0; i < n; i++) a[i] = b[cnt[i]];
  fwt.FWTxor(a, 1);
  fwt.FWTxor(val, 1);
  for (int i = 0; i < n; i++) a[i] = mul(val[i], fp(a[i], t));
  fwt.FWTxor(a, -1);
  for (int i = 0; i < n; i++) cout << a[i] / n << "\n";
}
