#include <bits/stdc++.h>
using namespace std;
long long wph;
long long mul(long long a, long long b) {
  long long c = (a * b - (long long)((long double)a / wph * b) * wph);
  return c < 0 ? c + wph : c;
}
void fwt(long long *a, int n, int f) {
  for (int k = 2, mid = 1; k <= n; k <<= 1, mid <<= 1)
    for (int i = 0; i < n; i += k)
      for (int j = 0; j < mid; j++) {
        long long x = a[i + j], y = a[i + mid + j];
        a[i + j] = (x + y) % wph, a[i + mid + j] = (x - y + wph) % wph;
      }
  if (f)
    for (int i = 0; i < n; i++) a[i] /= n;
}
long long c[2000010], b[2000010], f[2000010];
long long ksm(long long bs, long long mi) {
  long long ans = 1;
  while (mi) {
    if (mi & 1) ans = mul(ans, bs);
    bs = mul(bs, bs);
    mi >>= 1;
  }
  return ans;
}
long long count(long long x) {
  long long cnt = 0;
  while (x) x &= (x - 1), cnt++;
  return cnt;
}
int main() {
  long long t;
  int m, n;
  scanf("%d%I64d%I64d", &m, &t, &wph);
  n = 1 << m;
  wph *= n;
  for (int i = 0; i < n; i++) scanf("%I64d", &f[i]);
  for (int i = 0; i <= m; i++) scanf("%I64d", &b[i]);
  for (int i = 0; i < n; i++) c[i] = b[count(i)];
  fwt(c, n, 0);
  fwt(f, n, 0);
  for (int i = 0; i < n; i++) c[i] = ksm(c[i], t);
  for (int i = 0; i < n; i++) c[i] = mul(c[i], f[i]);
  fwt(c, n, 1);
  wph /= n;
  for (int i = 0; i < n; i++) printf("%I64d\n", c[i] % wph);
  return 0;
}
