#include <bits/stdc++.h>
using namespace std;
const int MAXN = (1 << 20) + 10;
int MOD;
struct Mat {
  vector<vector<long long> > v;
  int sz;
  Mat(int n, int f) {
    vector<long long> vv(n);
    for (int i = 0; i < n; i++) v.push_back(vv);
    sz = n;
    for (int i = 0; i < n; i++) v[i][i] = f;
  }
};
Mat zarb(Mat& a, Mat& b) {
  Mat ans(a.sz, 0);
  int n = a.sz;
  for (int i = 0; i < n; i++)
    for (int k = 0; k < n; k++)
      for (int j = 0; j < n; j++)
        ans.v[i][j] += (1LL * a.v[i][k] * b.v[k][j]) % MOD, ans.v[i][j] %= MOD;
  ;
  return ans;
}
Mat pow(Mat& a, long long t) {
  Mat ans(a.sz, 1);
  Mat x = a;
  while (t) {
    if (t & 1) ans = zarb(ans, x);
    x = zarb(x, x);
    t /= 2;
  }
  return ans;
}
int f(int x) {
  int ans = 0;
  while (x) ans += x % 2, x /= 2;
  return ans;
}
int add(int a, int b) { return (a + b >= MOD ? a + b - MOD : a + b); }
long long e[MAXN], b[MAXN];
long long dp[22][MAXN];
int32_t main() {
  int n, m;
  long long t;
  scanf("%d%I64d%d", &m, &t, &MOD);
  n = (1 << m);
  Mat M(m + 1, 0);
  for (int i = 0; i < n; i++) scanf("%d", &e[i]), e[i] %= MOD;
  for (int i = 0; i <= m; i++) scanf("%d", &b[i]), b[i] %= MOD;
  for (int i = 0; i < n; i++) {
    int x = f(i), y = n - 1;
    for (int j = m; j > -1; j--) {
      M.v[x][j] = add(M.v[x][j], b[f(i ^ y)]);
      if (y) y = y & (y - 1);
    }
  }
  if (!t) {
    for (int i = 0; i < n; i++) cout << e[i] << '\n';
    return 0;
  }
  M = pow(M, t);
  for (int i = 0; i <= m; i++) b[i] = M.v[0][i];
  for (int i = 0; i < n; i++) dp[0][i] = e[i] % MOD;
  for (int k = 0; k < m; k++)
    for (int j = m; j >= 1; j--)
      for (int i = 0; i < n; i++)
        dp[j][i] = add(dp[j][i], dp[j - 1][i ^ (1 << k)]);
  for (int i = 0; i < n; i++) {
    long long x = 0;
    for (int j = 0; j <= m; j++) x += 1LL * dp[j][i] * b[j] % MOD;
    printf("%I64d\n", (x + MOD) % MOD);
  }
}
