#include <bits/stdc++.h>
using namespace std;
const long long mod = 998244353;
const double eps = 1e-8;
const long long LINF = 0x3f3f3f3f3f3f3f3f;
const int INF = 0x3f3f3f3f;
long long P;
long long N;
inline long long add(register long long x, register long long y) {
  return x + y >= P ? x + y - P : x + y;
}
inline long long dec(register long long x, register long long y) {
  return x - y < 0 ? x - y + P : x - y;
}
inline long long mul(register long long x, register long long y) {
  return x * y - (long long)((long double)x / P * y) * P;
}
inline long long Pow(long long a, long long n) {
  long long t = 1;
  while (n > 0) {
    if (n & 1) t = mul(t, a);
    a = mul(a, a), n >>= 1;
  }
  return t;
}
inline long long ksm(register long long x, register long long y) {
  long long res = 1;
  for (; y; y >>= 1, x = mul(x, x)) y & 1 ? res = mul(res, x) : 0;
  return res;
}
void FWTxor(long long *a, long long opt) {
  for (long long mid = 1; mid < N; mid <<= 1)
    for (long long Rr = mid << 1, j = 0; j < N; j += Rr)
      for (long long k = 0; k < mid; k++) {
        long long x = a[j + k], y = a[j + k + mid];
        a[j + k] = add(x, y), a[j + k + mid] = dec(x, y);
      }
  if (opt != 1)
    for (long long i = 0; i < N; i++) a[i] /= N;
}
const long long maxn = 6e6 + 100;
long long a[maxn], b[maxn], c[maxn], sz[maxn];
signed main() {
  long long n, p;
  long long t;
  cin >> n >> t >> p;
  N = 1 << n;
  p *= N;
  P = p;
  for (long long i = 0; i < N; i++) {
    cin >> a[i];
    a[i] %= p;
  }
  for (long long i = 0; i <= n; i++) {
    cin >> b[i];
    b[i] %= p;
  }
  for (long long i = 0; i < N; i++) c[i] = b[sz[i] = (sz[i >> 1] + (i & 1))];
  FWTxor(a, 1), FWTxor(c, 1);
  for (long long i = 0; i < N; i++) a[i] = mul(a[i], Pow(c[i], t));
  FWTxor(a, -1);
  for (long long i = 0; i < N; i++) cout << a[i] << '\n';
  return 0;
}
