#include <bits/stdc++.h>
using namespace std;
const int N = 1 << 20, M = 21;
int x[M];
long long p, f[N], g[N];
int n, m, c;
inline long long mul(long long x, long long y) {
  x = x * y - (long long)((long double)x / p * y + 1e-8) * p;
  if (x < 0) return x + p;
  return x;
}
inline void read(int &x) {
  c = getchar();
  while ((c < 48) || (c > 57)) c = getchar();
  x = c ^ 48;
  c = getchar();
  while ((c >= 48) && (c <= 57)) {
    x = x * 10 + (c ^ 48);
    c = getchar();
  }
}
inline void read(long long &x) {
  c = getchar();
  while ((c < 48) || (c > 57)) c = getchar();
  x = c ^ 48;
  c = getchar();
  while ((c >= 48) && (c <= 57)) {
    x = x * 10 + (c ^ 48);
    c = getchar();
  }
}
void dft(long long *a) {
  register int i, j, k, l;
  register long long b;
  for (i = 1; i < n; i = l) {
    l = i << 1;
    for (j = 0; j < n; j += l)
      for (k = 0; k < i; k++) {
        b = a[j | k | i];
        a[j | k | i] = (a[j | k] - b + p) % p;
        a[j | k] = (a[j | k] + b) % p;
      }
  }
}
int main() {
  register long long t;
  register int i;
  read(m);
  read(t);
  read(p);
  p *= (n = 1 << m);
  for (i = 0; i < n; i++) read(f[i]);
  dft(f);
  for (i = 0; i <= m; i++) read(x[i]);
  for (i = 1; i < n; i++) g[i] = g[i >> 1] + (i & 1);
  for (i = 0; i < n; i++) g[i] = x[g[i]];
  dft(g);
  while (t) {
    if (t & 1)
      for (i = 0; i < n; i++) f[i] = mul(f[i], g[i]);
    for (i = 0; i < n; i++) g[i] = mul(g[i], g[i]);
    t >>= 1;
  }
  dft(f);
  for (i = 0; i < n; i++) printf("%d\n", int(f[i] >> m));
}
