#include <bits/stdc++.h>
using namespace std;
const int maxm = 20, maxn = 1 << maxm;
long long MOD;
inline long long llmul(long long a, long long b) {
  long long ret = (a * b - (long long)((long double)a * b / MOD) * MOD) % MOD;
  if (ret < 0) ret += MOD;
  return ret;
}
long long power(long long x, long long n) {
  if (n <= 1) return n ? x : 1;
  long long t = power(x, n / 2);
  if (n % 2)
    return llmul(llmul(t, t), x);
  else
    return llmul(t, t);
}
void FWT(long long *a, int n) {
  if (n == 1) return;
  int n2 = n >> 1;
  FWT(a, n2);
  FWT(a + n2, n2);
  for (int i = 0; i < n2; i++) {
    long long x = a[i], y = a[i + n2];
    a[i] = (x + y) % MOD;
    a[i + n2] = (x - y + MOD) % MOD;
  }
}
long long e0[maxn], b[maxm + 10], c[maxn];
long long ev[maxn];
int main() {
  int n, m;
  long long t, p;
  scanf("%d%I64d%I64d", &m, &t, &p);
  n = 1 << m;
  MOD = n * p;
  for (int i = 0; i < n; i++) scanf("%I64d", &e0[i]);
  for (int i = 0; i <= m; i++) scanf("%I64d", &b[i]);
  for (int i = 0; i < n; i++) ev[i] = b[__builtin_popcount(i)] % MOD;
  FWT(e0, n);
  FWT(ev, n);
  for (int i = 0; i < n; i++) c[i] = llmul(e0[i], power(ev[i], t));
  FWT(c, n);
  for (int i = 0; i < n; i++) printf("%I64d\n", ((c[i] + MOD) % MOD) >> m);
}
