#include <bits/stdc++.h>
using namespace std;
const int MAXM = 22;
int m, p, n;
long long t;
int a[MAXM], b[MAXM];
int c[MAXM][MAXM];
int w[MAXM][MAXM][MAXM];
int f[MAXM][1 << 20];
int mul(int a, int b) { return (long long)a * b % p; }
int add(int a, int b) { return a + b >= p ? a + b - p : a + b; }
void mult(int in1[], int in2[], int out[]) {
  static int h[MAXM];
  memset(h, 0, sizeof h);
  for (int i = 0; i <= m; ++i)
    for (int j = 0; j <= m; ++j)
      for (int k = 0; k <= m; ++k)
        h[k] = add(h[k], mul(w[i][j][k], mul(in1[i], in2[j])));
  memcpy(out, h, sizeof h);
}
void mypow(int in[], long long t, int out[]) {
  out[0] = 1;
  while (t) {
    if (t & 1) mult(out, in, out);
    mult(in, in, in);
    t /= 2;
  }
}
int main() {
  scanf("%d%I64d%d", &m, &t, &p);
  n = 1 << m;
  for (int i = 0; i < n; ++i) scanf("%d", f[0] + i), f[0][i] %= p;
  for (int i = 0; i <= m; ++i) scanf("%d", a + i), a[i] %= p;
  c[0][0] = 1;
  for (int i = 1; i < MAXM; ++i)
    for (int j = 0; j < MAXM; ++j) {
      c[i][j] = c[i - 1][j];
      if (j) c[i][j] = add(c[i][j], c[i - 1][j - 1]);
    }
  for (int i = 0; i <= m; ++i)
    for (int j = 0; j <= m; ++j)
      for (int k = 0; k <= m; ++k) {
        int l = (k + i - j) / 2;
        if (j != i + k - 2 * l) continue;
        if (l < 0 || i - l < 0) continue;
        w[i][j][k] = mul(c[k][l], c[m - k][i - l]);
      }
  mypow(a, t, b);
  for (int k = 0; k < m; ++k)
    for (int j = m; j > 0; --j)
      for (int i = 0; i < n; ++i)
        f[j][i] = add(f[j][i], f[j - 1][i ^ (1 << k)]);
  for (int i = 0; i < n; ++i) {
    int t = 0;
    for (int j = 0; j <= m; ++j) t = add(t, mul(f[j][i], b[j]));
    printf("%d\n", t);
  }
  return 0;
}
