func_code_string: #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;   }   