func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MOD = 1000000007;   const long long MODSQ = 1LL * MOD * MOD;   int W[8];   int dp[1 << 7][1 << 7][8][2];   struct matrix {     int sz;     int data[1 << 7][1 << 7];   };   matrix multiply(matrix& a, matrix& b) {     matrix c;     c.sz = a.sz;     for (int i = 0; i < c.sz; i++)       for (int j = 0; j < c.sz; j++) {         long long sum = 0;         for (int k = 0; k < c.sz; k++) {           sum += 1LL * a.data[i][k] * b.data[k][j];           if (sum >= MODSQ) sum -= MODSQ;         }         c.data[i][j] = sum % MOD;       }     return c;   }   matrix pow(matrix b, int e) {     if (e == 1) return b;     matrix ret = pow(multiply(b, b), e / 2);     if (e & 1) return multiply(ret, b);     return ret;   }   matrix transition_matrix(int sz) {     matrix ret;     ret.sz = 1 << sz;     for (int i = 0; i < (1 << sz); i++)       for (int j = 0; j < (1 << sz); j++) ret.data[i][j] = dp[i][j][sz][1];     return ret;   }   int main() {     for (int i = 0; i < (1 << 7); i++)       for (int j = 0; j < (1 << 7); j++) {         dp[i][j][0][0] = 0;         dp[i][j][0][1] = 1;         for (int k = 0; k < 7; k++) {           dp[i][j][k + 1][0] = dp[i][j][k][0] + dp[i][j][k][1];           dp[i][j][k + 1][1] = dp[i][j][k][0];           if (!(((i >> k) & 1) && ((j >> k) & 1)))             dp[i][j][k + 1][1] += dp[i][j][k][1];         }       }     int last = 0;     for (int i = 1; i <= 7; i++) {       scanf( %d , W + i);       if (W[i]) last = i;     }     matrix pre, base, tmp;     int psz = -1;     for (int i = 1; i <= last; i++)       if (W[i]) {         base.sz = 1 << i;         if (psz == -1) {           for (int j = 0; j < (1 << i); j++) base.data[j][0] = 0;           base.data[(1 << i) - 1][0] = 1;         } else {           for (int j = 0; j < (1 << i); j++) {             if ((j >> psz) == (1 << (i - psz)) - 1)               base.data[j][0] = pre.data[j & ((1 << psz) - 1)][0];             else               base.data[j][0] = 0;           }         }         tmp = pow(transition_matrix(i), W[i]);         pre = multiply(tmp, base);         psz = i;       }     printf( %d n , pre.data[(1 << last) - 1][0]);     return 0;   }   