func_code_string: #include <bits/stdc++.h>   using namespace std;   using ll = long long;   using ld = long double;   vector<vector<vector<ll>>> v;   vector<vector<ll>> mat;   vector<vector<ll>> matMal(vector<vector<ll>> mat1, vector<vector<ll>> mat2) {     vector<vector<ll>> mat3((int)(mat1).size(), vector<ll>((int)(mat1).size()));     for (int i = 0; i < (int)(mat1).size(); ++i) {       for (int j = 0; j < (int)(mat1).size(); ++j) {         ll sum = 0;         for (int k = 0; k < (int)(mat1).size(); ++k) {           sum = sum + (ll)mat1[i][k] * mat2[k][j] % 1000000007;         }         mat3[i][j] = sum % 1000000007;       }     }     return mat3;   }   vector<vector<ll>> matMult(vector<vector<ll>> matr, ll x) {     if (x == 1) return matr;     if (x % 2 == 1) return matMal(matMult(matr, x - 1), mat);     vector<vector<ll>> matTemp = matMult(matr, x / 2);     return matMal(matTemp, matTemp);   }   int main() {     int n, k, m;     vector<ll> anzb = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};     cin >> n >> k >> m;     mat.resize((1 << m) * (k + 1), vector<ll>((1 << m) * (k + 1)));     for (int i = 0; i < 1 << m; ++i) {       for (int j = 0; j < k + 1; ++j) {         if (i % 2 == 0) {           mat[(k + 1) * i + j][(k + 1) * (i / 2) + j] = 1;           mat[(k + 1) * i + j][(k + 1) * ((i + (1 << m)) / 2) + j] = 1;         } else if (j != 0) {           mat[(k + 1) * i + j][(k + 1) * (i / 2) + j - 1] = anzb[i / 2] + 1;           mat[(k + 1) * i + j][(k + 1) * ((i + (1 << m)) / 2) + j - 1] =               anzb[(i + (1 << m)) / 2] + 1;         }       }     }     mat = matMult(mat, n);     ll sum = 0;     for (int i = 0; i < 1 << m; ++i) {       sum = (sum + mat[(k + 1) * i + k][0]) % 1000000007;     }     cout << sum << endl;   }   