#include <bits/stdc++.h>
#define ll long long
#define f first
#define s second
const ll mod = 1000000007;
const int N = 105;
using namespace std;
int n,k,m;
vector<int>v1;
vector<pair<int,int>>v2;
int id[105][105],cnt[105][105];
struct Matrix {
ll val[N][N];
Matrix() {
for(int i = 0; i < m; i++) {
for(int j = 0; j < m; j++) {
val[i][j] = 0;
}
}
}
void unit() {
for(int i = 0; i < m; i++) {
val[i][i] = 1;
}
}
};
Matrix I;
Matrix operator * (Matrix x, Matrix y) {
Matrix res;
for(int i = 0; i < m; i++) {
for(int j = 0; j < m; j++) {
for(int k = 0; k < m; k++) {
res.val[i][j] += (x.val[i][k] * y.val[k][j]) % mod;
res.val[i][j] %= mod;
}
}
}
return res;
}
Matrix power(Matrix x, ll n) {
Matrix res;
res.unit();
while(n) {
if(n & 1)res = res * x;
n /= 2;
x = x * x;
}
return res;
}
void iswn(){
cin >> n >> k;
for(int i = 0;i < (1 << k);i++){
if(i & (i << 1))continue;
v1.push_back(i);
}
if(n == 1){cout << v1.size();return;}
for(int i = 0;i < v1.size();i++){
int x = v1[i];
for(int j = 0;j < k - 2;j++){
cnt[v1[i]][j] = __builtin_popcountll(x & 7);
x >>= 1;
}
for(int j = 0;j < v1.size();j++){
if(v1[i] & v1[j])continue;
id[v1[i]][v1[j]] = v2.size();
v2.push_back({v1[i],v1[j]});
}
}
if(n == 2){cout << v2.size();return;}
m = v2.size();
for(int i = 0;i < v2.size();i++){
for(int j = 0;j < v1.size();j++){
if(v2[i].s & v1[j])continue;
bool ok = 1;
for(int l = 0;l < k - 2;l++){
int x = cnt[v2[i].f][l] + cnt[v2[i].s][l] + cnt[v1[j]][l];
if(x < 2){
ok = 0;
break;
}
}
if(ok){
I.val[id[v2[i].f][v2[i].s]][id[v2[i].s][v1[j]]] = 1;
}
}
}
Matrix Fi = power(I,n-2);
ll res = 0;
for(int i = 0;i < m;i++){
for(int j = 0;j < m;j++){
res += Fi.val[i][j];
res %= mod;
}
}
cout << res;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
if(fopen("BAIC.INP","r")){
freopen("BAIC.INP","r",stdin);
freopen("BAIC.OUT","w",stdout);
}
int ts = 1;//cin >> ts;
while(ts--)iswn();
return 0;
}