#include <bits/stdc++.h>
using namespace std;
int n, m;
long long P;
int pop[1 << 20];
long long a[1 << 20], b[1 << 20], w[30];
long long tmp[1 << 20];
void tf(long long a[], int n) {
  if (n == 1) return;
  int x = n >> 1;
  tf(a, x);
  tf(a + x, x);
  for (int i = 0; i < x; ++i) {
    tmp[i] = a[i] - a[x + i];
    if (tmp[i] < 0) tmp[i] += P;
    tmp[i + x] = a[i] + a[x + i];
    if (tmp[i + x] >= P) tmp[i + x] -= P;
  }
  for (int i = 0; i < n; ++i) a[i] = tmp[i];
}
void utf(long long a[], int n) {
  if (n == 1) return;
  int x = n >> 1;
  for (int i = 0; i < x; ++i) {
    tmp[i] = a[i] + a[i + x];
    if (tmp[i] >= P) tmp[i] -= P;
    tmp[i + x] = a[i + x] - a[i];
    if (tmp[i + x] < 0) tmp[i + x] += P;
  }
  for (int i = 0; i < n; ++i) a[i] = tmp[i];
  utf(a, x);
  utf(a + x, x);
}
inline long long Mul(long long x, long long y) {
  return (x * y - (long long)(x / (long double)P * y + 1e-3) * P + P) % P;
}
inline long long pow_mod(long long a, long long b) {
  long long c = 1;
  while (b) {
    if (b & 1) c = Mul(c, a);
    b >>= 1;
    a = Mul(a, a);
  }
  return c;
}
int main() {
  long long t;
  cin >> m >> t >> P;
  n = 1 << m;
  P *= n;
  for (int i = 0; i < n; ++i) {
    scanf("%I64d", a + i);
    a[i] %= P;
  }
  for (int i = 0; i <= m; ++i) {
    scanf("%I64d", w + i);
    w[i] %= P;
  }
  for (int i = 1; i < n; ++i) {
    pop[i] = pop[i >> 1] + (i & 1);
  }
  for (int i = 0; i < n; ++i) {
    b[i] = w[pop[i]];
  }
  tf(a, n);
  tf(b, n);
  for (int i = 0; i <= m; ++i) {
    w[i] = pow_mod(b[(1 << i) - 1], t);
  }
  for (int i = 0; i < n; ++i) {
    b[i] = w[pop[i]];
    a[i] = Mul(a[i], b[i]);
  }
  utf(a, n);
  for (int i = 0; i < n; ++i) {
    printf("%I64d\n", a[i] / n);
  }
  return 0;
}
