func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAXN = 7, MAXM = 1e5 + 5, MOD = 1e9 + 7, bit_one = (1 << MAXN) - 1;   int n, ans;   int w[MAXN];   int pre_process[MAXN][(1 << MAXN)][(1 << MAXN)];   int add(int a, int b) {     int c = a + b;     while (c >= MOD) c -= MOD;     return c;   }   int mul(int a, int b) { return 1LL * a * b % MOD; }   struct matrix {     int data[(1 << MAXN)][(1 << MAXN)];     int n, m;     matrix(int a = (1 << MAXN), int b = (1 << MAXN), bool c = 0) {       n = a;       m = b;       for (int i = 0; i < n; i++)         for (int j = 0; j < m; j++) data[i][j] = (i == j) * c;     }     void operator*=(matrix tmp) {       matrix res(n, tmp.m);       for (int i = 0; i < n; i++)         for (int j = 0; j < m; j++)           for (int k = 0; k < tmp.m; k++)             res.data[i][k] = add(res.data[i][k], mul(data[i][j], tmp.data[j][k]));       (*this) = res;     }     void operator^=(int tmp) {       matrix res(n, m, 1);       for (; tmp; tmp /= 2) {         if (tmp & 1) res *= (*this);         (*this) *= (*this);       }       (*this) = res;     }   };   bool cheak(int a, int b, int c, int d) {     for (int i = 0; i <= a; i++)       if (((d >> i) & 1) && ((d >> (i + 1)) & 1) && ((b >> i) & 1) &&           ((c >> i) & 1))         return 0;     return 1;   }   int main() {     for (int i = 0; i < 7; i++) scanf( %d , &w[i]);     for (int i = 0; i < 7; i++)       for (int j = 0; j < (1 << (i + 1)); j++)         for (int k = 0; k < (1 << (i + 1)); k++)           for (int h = 0; h < (1 << i); h++)             pre_process[i][j][k] += cheak(i, j, k, (1 << (i + 1)) | (h << 1 | 1));     matrix M[7];     for (int i = 0; i < 7; i++) M[i].n = M[i].m = (1 << (i + 1));     for (int i = 0; i < 7; i++) {       for (int j = 0; j < (1 << (i + 1)); j++)         for (int k = 0; k < (1 << (i + 1)); k++)           M[i].data[j][k] = pre_process[i][j][k];       M[i] ^= w[i];     }     matrix A[7];     for (int i = 0; i < 7; i++) {       A[i].n = (1 << (i + 1));       A[i].m = 1;     }     A[0].data[1][0] = 1;     M[0] *= A[0];     A[0] = M[0];     for (int i = 1; i < 7; i++) {       for (int j = 0; j < (1 << i); j++) {         int tmp = j << 1 | 1;         A[i].data[tmp][0] = A[i - 1].data[j][0];       }       M[i] *= A[i];       A[i] = M[i];     }     ans = A[6].data[bit_one][0];     printf( %d , ans);   }   