func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long mod = 1e9 + 7;   struct SquareMatrix {     SquareMatrix(int _n) : n(_n) { data.assign(_n, vector<long long>(_n, 0)); }     vector<long long> &operator[](int i) { return data[i]; }     const vector<long long> &operator[](int i) const { return data[i]; }     SquareMatrix operator*(const SquareMatrix &other) const {       assert(n == other.n);       SquareMatrix ret(n);       for (int i = 0; i < n; ++i) {         for (int j = 0; j < n; ++j) {           for (int k = 0; k < n; ++k) {             ret[i][j] = (ret[i][j] + data[i][k] * other[k][j]) % mod;           }         }       }       return ret;     }     vector<vector<long long>> data;     int n;   };   SquareMatrix quickpower(SquareMatrix m, long long p) {     int n = m.n;     SquareMatrix ret(n);     for (int i = 0; i < n; ++i) ret[i][i] = 1;     while (p) {       if (p & 1) {         ret = ret * m;       }       m = m * m;       p >>= 1;     }     return ret;   }   int fun(int x) {     int res = 0;     while (x) {       res += x % 2;       x /= 2;     }     return res;   }   int main() {     long long n, k, m;     scanf( %lld %lld %lld , &n, &k, &m);     long long num = 1 << m;     SquareMatrix M(num * (k + 1));     for (int i = 0; i < num * (k + 1); i++) {       int x = i % (k + 1);       int y = i / (k + 1);       int x1 = x;       int y1 = (y * 2) % num;       int x2 = x + 1;       int y2 = (y * 2) % num + 1;       M[i][y1 * (k + 1) + x1] += 1;       if (x2 <= k) M[i][y2 * (k + 1) + x2] += fun(y) + 1ll;     }     M = quickpower(M, n);     long long ans = 0;     for (int i = 0; i < num; i++) ans = (ans + M[0][i * (k + 1) + k]) % mod;     cout << ans << endl;     return 0;   }   