#include <bits/stdc++.h>
using namespace std;
const long long maxM = 22, maxN = ((1LL << 20) + 1);
long long M, mod, T, N;
int bc[maxM][maxM];
int dp[maxN][2][maxM];
int arr[maxN], b[maxM], p2[maxM];
struct Matrix {
  long long n, m;
  long long val[maxM][maxM];
  Matrix() {
    for (int i = 0; i < n; i++)
      for (int j = 0; j < m; j++) val[i][j] = 0;
  }
};
Matrix operator*(Matrix A, Matrix B) {
  Matrix ret;
  ret.n = 1, ret.m = M;
  for (int k = 0; k <= M; k++) {
    long long vl = 0;
    for (int i = 0; i <= (M - k); i++) {
      long long vl2 = 0;
      for (int j = 0; j <= k; j++) {
        vl2 = (vl2 +
               (((bc[k][j] * A.val[0][i + j]) % mod) * B.val[0][i + k - j])) %
              mod;
      }
      vl = (vl + (bc[M - k][i] * vl2)) % mod;
    }
    vl %= mod;
    if (vl < 0) vl += mod;
    ret.val[0][k] = vl;
  }
  return ret;
}
Matrix Pow(Matrix A, long long b) {
  Matrix Temp;
  Temp.n = 1;
  Temp.m = M;
  for (int i = 0; i <= M; i++) Temp.val[0][i] = (int(i == 0));
  if (b == 0) return Temp;
  Matrix res = A;
  for (b--; b; b >>= 1, A = A * A)
    if (b & 1) res = res * A;
  return res;
}
int main() {
  scanf("%lld%lld%lld", &M, &T, &mod);
  N = (1LL << M);
  for (int i = 0; i < N; i++) {
    scanf("%lld", &arr[i]);
    arr[i] %= mod;
    dp[i][0][0] = arr[i];
  }
  bc[0][0] = 1;
  p2[0] = 1;
  for (int i = 1; i <= (M + 1); i++) {
    p2[i] = 2 * p2[i - 1];
    for (int j = 0; j <= i; j++) {
      if (j == 0 || j == i)
        bc[i][j] = 1;
      else
        bc[i][j] = (bc[i - 1][j - 1] + bc[i - 1][j]);
    }
  }
  for (int i = 0; i <= M; i++) {
    scanf("%lld", &b[i]);
    b[i] %= mod;
  }
  long long J = 1;
  for (int j = 1; j <= M; j++) {
    for (int i = 0; i < N; i++) {
      for (int k = 0; k <= M; k++) {
        if (j == 0 && k == 0) {
          dp[i][J][k] = arr[i];
        } else if (j == 0)
          dp[i][J][k] = 0;
        else {
          dp[i][J][k] = (dp[i][1 - J][k] + dp[i ^ (p2[j - 1])][1 - J][k - 1]);
          if (dp[i][J][k] >= mod) dp[i][J][k] -= mod;
        }
      }
    }
    J = 1 - J;
  }
  Matrix B;
  B.n = 1;
  B.m = M;
  for (int i = 0; i <= M; i++) B.val[0][i] = b[i];
  Matrix c = Pow(B, T);
  long long MD = M % 2, ans;
  for (int i = 0; i < N; i++) {
    ans = 0;
    for (int j = 0; j <= M; j++)
      ans = (ans + (c.val[0][j] * dp[i][MD][j])) % mod;
    printf("%lld\n", ans);
  }
  return 0;
}
