#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
int n, m, ans;
int f[105][105];
int p = 1e9 + 7;
struct Mat {
int t[55][55];
Mat() {memset(t, 0, sizeof t);}
} x;
Mat Mul(Mat a, Mat b) {
Mat c;
for (int i = 1; i <= m; i++)
for (int j = 1; j <= m; j++)
for (int k = 1; k <= m; k++)
c.t[i][j] = (c.t[i][j] + (ll)a.t[i][k] * b.t[k][j] % p) % p;
return c;
}
Mat Pow(Mat a, int b) {
Mat c;
for (int i = 1; i <= m; i++) c.t[i][i] = 1;
while (b) {
if (b & 1) c = Mul(c, a);
a = Mul(a, a); b >>= 1;
}
return c;
}
int main() {
scanf("%d%d", &n, &m);
n >>= 1; m >>= 1;
f[1][m - 1] = f[1][m + 1] = 1;
for (int i = 2; i <= (m << 1); i++)
for (int j = 0; j <= (m << 1); j++) {
if (j - 1 != m) f[i][j] = (f[i][j] + f[i - 1][j - 1]) % p;
if (j + 1 != m) f[i][j] = (f[i][j] + f[i - 1][j + 1]) % p;
}
for (int i = 2; i <= m; i++) x.t[i][i - 1] = 1;
for (int i = 1; i <= m; i++) x.t[m + 1 - i][m] = f[i << 1][m];
x = Pow(x, n);
printf("%d", x.t[m][m]);
return 0;
}