#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1);
long long mo, a[(1 << 20) + 10], d[(1 << 20) + 10], t;
int m, n, b[120];
long long mul(long long a, long long b) {
  return (a * b - (long long)((long double)a * b / mo) * mo) % mo;
}
long long Pow(long long x, long long y) {
  long long res = 1;
  while (y) {
    if (y & 1) res = mul(res, x);
    x = mul(x, x);
    y /= 2;
  }
  return res;
}
void DFT(long long a[], int flag) {
  for (int i = 1; i < n; i <<= 1)
    for (int j = 0; j < n; j += i << 1)
      for (int k = 0; k < i; ++k) {
        long long u = a[j + k], v = a[i + j + k];
        a[j + k] = u + v;
        if (a[j + k] >= mo) a[j + k] -= mo;
        a[i + j + k] = u - v;
        if (a[i + j + k] < 0) a[i + j + k] += mo;
      }
  if (flag == -1) {
    for (int i = 0; i <= n - 1; ++i) a[i] /= n;
  }
}
int main() {
  scanf("%d%I64d%I64d", &m, &t, &mo);
  n = 1 << m;
  mo *= n;
  for (int i = 0; i <= n - 1; ++i) scanf("%I64d", &a[i]), a[i] %= mo;
  for (int i = 0; i <= m; ++i) scanf("%d", &b[i]), b[i] %= mo;
  for (int i = 0; i <= n - 1; ++i) d[i] = b[__builtin_popcount(i)];
  DFT(a, 1);
  DFT(d, 1);
  for (int i = 0; i <= n - 1; ++i) a[i] = mul(a[i], Pow(d[i], t));
  DFT(a, -1);
  for (int i = 0; i <= n - 1; ++i) printf("%I64d\n", a[i]);
}
