#include <bits/stdc++.h>
using namespace std;
int m;
long long t, p, n;
long long A[1 << 21], T[1 << 21];
long long b[100];
long long Multi(long long a, long long b) {
  return (a * b - (long long)((long double)a * b / p) * p) % p;
}
void FWT(long long *A, int l, int r) {
  if (l == r - 1) return;
  int mid = (l + r) >> 1;
  FWT(A, l, mid), FWT(A, mid, r);
  for (int i = l; i < mid; i++) {
    long long &X = A[i], &Y = A[i + mid - l];
    X = X + Y, Y = X - Y - Y;
    if (X >= p) X -= p;
    if (Y < 0) Y += p;
  }
}
inline int bits(int x) {
  int Ans = 0;
  for (; x; x >>= 1)
    if (x & 1) Ans++;
  return Ans;
}
inline long long Pow(long long x, long long t) {
  long long Ans = 1;
  for (; t; t >>= 1) {
    if (t & 1) Ans = Multi(Ans, x);
    x = Multi(x, x);
  }
  return Ans;
}
int main() {
  scanf("%d%I64d%I64d", &m, &t, &p);
  n = 1 << m;
  for (int i = 0; i < n; i++) scanf("%I64d", A + i), A[i] %= p;
  for (int i = 0; i <= m; i++) scanf("%d", b + i);
  for (int i = 0; i < n; i++) T[i] = b[bits(i)] % p;
  p = p << m;
  FWT(T, 0, n), FWT(A, 0, n);
  for (int i = 0; i < n; i++) T[i] = Pow(T[i], t), A[i] = Multi(A[i], T[i]);
  FWT(A, 0, n);
  for (int i = 0; i < n; i++) printf("%I64d\n", A[i] >> m);
  return 0;
}
