#include <bits/stdc++.h>
inline long long read() {
  long long x = 0;
  int zf = 1;
  char ch = ' ';
  while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
  if (ch == '-') zf = -1, ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  return x * zf;
}
long long e0[1 << 21], b[25], c[1 << 21], sz[1 << 21];
long long n, m, t, p;
inline long long add(long long x, long long y) {
  return (x + y >= p) ? (x + y - p) : (x + y);
}
inline long long minus(long long x, long long y) {
  return (x - y < 0) ? (x - y + p) : (x - y);
}
inline long long mul(long long x, long long y) {
  return x * y - (long long)((long double)(x) / p * y) * p;
}
inline long long ksm(long long x, long long y) {
  long long res = 1;
  for (; y; y >>= 1, x = mul(x, x))
    if (y & 1) res = mul(res, x);
  return res;
}
void FWT(long long *arr, int len, int op) {
  long long tmp;
  for (int mid = 1; mid < len; mid <<= 1)
    for (int j = 0; j < len; j += (mid << 1))
      for (int k = 0; k < mid; ++k) {
        tmp = arr[j + k + mid];
        arr[j + k + mid] = minus(arr[j + k], tmp);
        arr[j + k] = add(arr[j + k], tmp);
      }
  if (!op)
    for (int i = 0; i < len; ++i) arr[i] /= len;
}
int main() {
  m = read(), t = read(), p = read();
  n = (1 << m);
  p *= n;
  for (int i = 0; i < n; ++i) e0[i] = read() % p;
  for (int i = 0; i <= m; ++i) b[i] = read() % p;
  for (int i = 0; i < n; ++i) {
    sz[i] = sz[i >> 1] + (i & 1);
    c[i] = b[sz[i]];
  }
  FWT(e0, n, 1);
  FWT(c, n, 1);
  for (int i = 0; i < n; ++i) e0[i] = mul(e0[i], ksm(c[i], t));
  FWT(e0, n, 0);
  for (int i = 0; i < n; ++i) printf("%lld\n", e0[i]);
  return 0;
}
