#include <bits/stdc++.h>
using namespace std;
const long long N = 21;
long long a[1 << N];
long long b[1 << N], c[1 << N];
long long tmp[1 << N];
long long MOD, t, n, m;
long long bin[1 << N];
long long mul(long long A, long long B) {
  long long temp = ((long long)((long double)A * B / MOD + 1e-6) * MOD);
  return A * B - temp;
}
long long Pow(long long x, long long y) {
  if (y == 1) return x;
  long long lalal = Pow(x, y >> 1);
  lalal = mul(lalal, lalal);
  if (y & 1) lalal = mul(lalal, x);
  return lalal;
}
void FWT(long long *a, long long n, long long o) {
  for (long long u = 1; u < n; u <<= 1)
    for (long long i = 0; i < n; i++)
      if (i & u) {
        long long x = a[i], y = a[i ^ u];
        a[i] = ((y - x) % MOD + MOD) % MOD;
        a[i ^ u] = (y + x) % MOD;
        if (o == -1) {
          a[i] /= 2;
          a[i ^ u] /= 2;
        }
      }
}
int main() {
  scanf("%lld%lld%lld", &m, &t, &MOD);
  n = (1 << m);
  MOD = MOD * n;
  for (long long u = 0; u < n; u++) scanf("%lld", &a[u]);
  for (long long u = 0; u < n; u++) bin[u] = bin[u >> 1] + (u & 1);
  for (long long u = 0; u <= m; u++) scanf("%lld", &c[u]);
  for (long long u = 0; u < n; u++) b[u] = c[bin[u]];
  FWT(a, n, 1);
  FWT(b, n, 1);
  for (long long u = 0; u < n; u++) {
    b[u] = Pow(b[u], t);
    a[u] = mul(a[u], b[u]);
  }
  FWT(a, n, -1);
  MOD /= n;
  for (long long u = 0; u < n; u++) printf("%lld\n", a[u] % MOD);
  return 0;
}
