#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; const int MOD = (int)1e9 + 7; int n, m; struct Matrix { int d[1 << 7][1 << 7]; Matrix() { memset(d, 0, sizeof(d)); } Matrix operator * (const Matrix &I) const { Matrix ans; for(int k = 0; k < (1 << m); k++) { for(int i = 0; i < (1 << m); i++) { for(int j = 0; j < (1 << m); j++) { ans.d[i][j] += (long long)d[i][k] * I.d[k][j] % MOD; if(ans.d[i][j] >= MOD) ans.d[i][j] -= MOD; } } } return ans; } }; Matrix modExp(Matrix a, int b) { Matrix t; for(int i = 0; i < (1 << m); i++) t.d[i][i] = 1; Matrix y = a; while(b) { if(b & 1) t = t * y; y = y * y; b >>= 1; } return t; } bool judge(int x, int y) { for(int i = 0; i < m - 1; i++) { if(((x >> i & 1) ^ (y >> i & 1)) && ((x >> (i + 1) & 1) ^ (y >> (i + 1) & 1)) && ((x >> (i + 1) & 1) == (y >> i & 1))) return false; } return true; } int main() { while(~scanf("%d%d", &n, &m)) { Matrix M; for(int i = 0; i < (1 << m); i++) { for(int j = 0; j < (1 << m); j++) { M.d[i][j] = judge(i, j); } } Matrix ans = modExp(M, n); /* for(int i = 0; i < (1 << m); i++) { for(int j = 0; j < (1 << m); j++) { printf("%d ", ans.d[i][j]); } printf("\n"); } */ int ret = 0; for(int i = 0; i < (1 << m); i++) { ret += ans.d[0][i]; if(ret >= MOD) ret -= MOD; } printf("%d\n", ret); } return 0; }