#include <bits/stdc++.h>
const int MAXN = 1 << 20;
int m, P, b[MAXN];
long long Dollar1, f[MAXN], g[MAXN], t;
inline long long up(long long x) {
  return x -= Dollar1, x + (x >> 63 & Dollar1);
}
inline long long down(const long long x) { return x + (x >> 63 & Dollar1); }
inline long long mul(const long long x, const long long y) {
  long long t = x * y - static_cast<long long>(
                            static_cast<long double>(x) * y / Dollar1 + 0.5) *
                            Dollar1;
  return t + (t >> 63 & Dollar1);
}
inline long long fastpow(long long a, long long b) {
  long long res = 1;
  while (b) {
    if (b & 1) res = mul(res, a);
    a = mul(a, a);
    b >>= 1;
  }
  return res;
}
void FWT(long long* A) {
  const int lim = 1 << m;
  for (int mid = 1; mid != lim; mid <<= 1)
    for (int k = 0; k != lim; k += mid << 1)
      for (int l = 0; l != mid; ++l) {
        const long long X = A[l + k], Y = A[l + k + mid];
        A[l + k] = up(X + Y);
        A[l + k + mid] = down(X - Y);
      }
}
int main() {
  scanf("%d%lld%d", &m, &t, &P);
  Dollar1 = static_cast<long long>(P) << m;
  const int lim = 1 << m;
  for (int i = 0; i != lim; ++i) scanf("%lld", f + i);
  for (int i = 0; i <= m; ++i) scanf("%d", b + i);
  for (int i = 0; i != lim; ++i) g[i] = b[__builtin_popcount(i)];
  FWT(f);
  FWT(g);
  for (int i = 0; i != lim; ++i) f[i] = mul(fastpow(g[i], t), f[i]);
  FWT(f);
  for (int i = 0; i != lim; ++i) printf("%lld\n", f[i] >> m);
  return 0;
}
