#include <bits/stdc++.h>
using namespace std;
const int N = 1 << 20, M = 20;
int n, m;
long long mod, t;
long long inie[N + 3], tra_[M + 3], tra[N + 3], res[N + 3];
long long Add(long long a, long long b) {
  return a + b >= mod ? a + b - mod : a + b;
}
long long Sub(long long a, long long b) {
  return a - b < 0 ? a - b + mod : a - b;
}
long long Mul(long long a, long long b) {
  long long tmp = (a * b - (long long)((long double)a / mod * b) * mod);
  return tmp < 0 ? tmp + mod : tmp;
}
void FWTXor(long long *A, int len, int typ) {
  for (int L = 2; L <= len; L <<= 1) {
    int T = L >> 1;
    for (int i = 0; i < len; i += L)
      for (int j = i; j < i + T; j++) {
        long long Aj = A[j];
        A[j] = Add(Aj, A[j + T]);
        A[j + T] = Sub(Aj, A[j + T]);
      }
  }
  if (typ == -1)
    for (int i = 0; i < len; i++) A[i] /= n;
}
int Count1(int num) {
  int ret = 0;
  while (num) {
    ret++;
    num ^= (num & -num);
  }
  return ret;
}
int main() {
  scanf("%d%lld%lld", &m, &t, &mod);
  n = 1 << m;
  mod *= n;
  for (int i = 0; i < n; i++) scanf("%lld", &inie[i]);
  for (int i = 0; i <= m; i++) scanf("%lld", &tra_[i]);
  for (int i = 0; i < n; i++) tra[i] = tra_[Count1(i)];
  res[0] = 1;
  FWTXor(res, n, 1);
  FWTXor(tra, n, 1);
  FWTXor(inie, n, 1);
  while (t) {
    if (t & 1)
      for (int i = 0; i < n; i++) res[i] = Mul(res[i], tra[i]);
    for (int i = 0; i < n; i++) tra[i] = Mul(tra[i], tra[i]);
    t >>= 1;
  }
  for (int i = 0; i < n; i++) res[i] = Mul(res[i], inie[i]);
  FWTXor(res, n, -1);
  for (int i = 0; i < n; i++) printf("%lld\n", res[i]);
  return 0;
}
