#include <bits/stdc++.h>
using namespace std;
long long mod=1e9 + 7;
int m;
struct matrix {
long long v, h;
vector<vector<long long>> c = vector<vector<long long>>(500, vector<long long>(500, 0));
matrix(int a = 500, int b = 500){
v = a;
h = b;
}
void ident(){
for(int i = 0; i < v; i++) c[i][i] = 1;
}
};
int id(int i, int j){
i--;
j--;
return i * m + j;
}
matrix operator * (matrix a,matrix b){
int n = a.v, m = a.h, p = b.h;
matrix res(n, p);
for (int i=0;i<n;i++)
for (int j=0;j<p;j++){
for (int k=0;k<m;k++){
res.c[i][j]+= ((a.c[i][k] % mod) * (b.c[k][j] % mod)) % mod;
res.c[i][j] %= mod;
}
}
return res;
}
matrix powermod(matrix a, long long n){
matrix r(a.v, a.v);
r.ident();
for(; n > 0; n >>= 1, a = a * a) if(n & 1) r = r * a; return r;
}
int main(){
// freopen("tile.inp", "r", stdin);
// freopen("tile.out", "w", stdout);
ios_base::sync_with_stdio(false);
cin.tie(NULL);
long long n, k, p, q, r; cin >> n >> m >> k;
matrix dp(m * m, 1);
for(int i = 1; i <= m; i++){
dp.c[id(i, i)][0] = 1;
for(int j = 1; j < i; j++){
for(int d = max(1LL, j - k); d <= min(j + k, (long long)i); d++){
dp.c[id(i, j)][0] += dp.c[id(i - j, d)][0];
}
}
}
dp.c[0][0] = 1;
matrix a(m * m + m * m);
for(int j = 1; j <= m; j++){
for(int d = max(1LL, j - k); d <= min(j + k, (long long)m); d++){
a.c[id(m, j)][id(m - j + 1, d)] = 1;
}
}
for(int i = 1; i < m; i++){
for(int j = 1; j <= m; j++){
a.c[id(i, j)][id(i + 1, j)] = 1;
}
}
// for(int i = 0; i <= (m + 1) * (m + 1); i++){
// cout << dp.c[i][0] << endl;
// }
// for(int i = 0; i < (m + 1) * ( m + 1); i++){
// for(int j = 0; j < (m + 1) * ( m + 1); j++)cout << a.c[i][j] << " ";
// cout << endl;
// }
// cout << endl;
if(m >= n){
long long ans = 0;
for(int i = 1; i <= m; i++) ans = (ans + dp.c[id(n, i)][0]) % mod;
cout << ans;
}else{
a = powermod(a, n - m) * dp;
long long ans = 0;
for(int i = 1; i <= m; i++) ans = (ans + a.c[id(m, i)][0]) % mod;
// for(int i = 0; i < (m + 1) * ( m + 1); i++){
// for(int j = 0; j < (m + 1) * ( m + 1); j++)cout << a.c[i][j] << " ";
// cout << endl;
// }
cout << ans;}
// cout << a.c[0][0];
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpsb25nIGxvbmcgbW9kPTFlOSArIDc7CmludCBtOwpzdHJ1Y3QgbWF0cml4IHsKICAgIGxvbmcgbG9uZyB2LCBoOwogICAgdmVjdG9yPHZlY3Rvcjxsb25nIGxvbmc+PiBjID0gdmVjdG9yPHZlY3Rvcjxsb25nIGxvbmc+Pig1MDAsIHZlY3Rvcjxsb25nIGxvbmc+KDUwMCwgMCkpOwogICAgbWF0cml4KGludCBhID0gNTAwLCBpbnQgYiA9IDUwMCl7CiAgICAJdiA9IGE7CiAgICAJaCA9IGI7CiAgICB9CiAgICB2b2lkIGlkZW50KCl7CiAgICAJZm9yKGludCBpID0gMDsgaSA8IHY7IGkrKykgY1tpXVtpXSA9IDE7CiAgICB9CiAgICAKfTsKCmludCBpZChpbnQgaSwgaW50IGopewoJaS0tOwoJai0tOwoJcmV0dXJuIGkgKiBtICsgajsKfQoKbWF0cml4IG9wZXJhdG9yICogKG1hdHJpeCBhLG1hdHJpeCBiKXsKICAgIAogICAgaW50IG4gPSBhLnYsIG0gPSBhLmgsIHAgPSBiLmg7CiAgICBtYXRyaXggcmVzKG4sIHApOwogICAgZm9yIChpbnQgaT0wO2k8bjtpKyspCiAgICAgICAgZm9yIChpbnQgaj0wO2o8cDtqKyspewogICAgICAgICAgICBmb3IgKGludCBrPTA7azxtO2srKyl7CiAgICAgICAgICAgICAgICByZXMuY1tpXVtqXSs9ICgoYS5jW2ldW2tdICUgbW9kKSAqIChiLmNba11bal0gJSBtb2QpKSAlIG1vZDsKICAgICAgICAgICAgICAgIHJlcy5jW2ldW2pdICU9IG1vZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIHJldHVybiByZXM7Cn0KbWF0cml4IHBvd2VybW9kKG1hdHJpeCBhLCBsb25nIGxvbmcgbil7CiAgICBtYXRyaXggcihhLnYsIGEudik7CiAgICByLmlkZW50KCk7CiAgICBmb3IoOyBuID4gMDsgbiA+Pj0gMSwgYSA9IGEgKiBhKSBpZihuICYgMSkgciA9IHIgKiBhOyByZXR1cm4gcjsKCn0KaW50IG1haW4oKXsKCS8vIGZyZW9wZW4oInRpbGUuaW5wIiwgInIiLCBzdGRpbik7CgkvLyBmcmVvcGVuKCJ0aWxlLm91dCIsICJ3Iiwgc3Rkb3V0KTsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShOVUxMKTsKICAgIGxvbmcgbG9uZyBuLCBrLCBwLCBxLCByOyBjaW4gPj4gbiA+PiBtID4+IGs7CiAgICBtYXRyaXggZHAobSAqIG0sIDEpOwogICAgZm9yKGludCBpID0gMTsgaSA8PSBtOyBpKyspewogICAgCWRwLmNbaWQoaSwgaSldWzBdID0gMTsKICAgIAlmb3IoaW50IGogPSAxOyBqIDwgaTsgaisrKXsKICAgIAkJZm9yKGludCBkID0gbWF4KDFMTCwgaiAtIGspOyBkIDw9IG1pbihqICsgaywgKGxvbmcgbG9uZylpKTsgZCsrKXsKICAgIAkJCWRwLmNbaWQoaSwgaildWzBdICs9IGRwLmNbaWQoaSAtIGosIGQpXVswXTsKICAgIAkJfQogICAgCX0KICAgIH0KICAgIGRwLmNbMF1bMF0gPSAxOwoJbWF0cml4IGEobSAqIG0gKyBtICogbSk7CiAgICBmb3IoaW50IGogPSAxOyBqIDw9IG07IGorKyl7CiAgICAJZm9yKGludCBkID0gbWF4KDFMTCwgaiAtIGspOyBkIDw9IG1pbihqICsgaywgKGxvbmcgbG9uZyltKTsgZCsrKXsKICAgIAkJYS5jW2lkKG0sIGopXVtpZChtIC0gaiArIDEsIGQpXSA9IDE7CiAgICAJfQogICAgfQogICAgCiAgICBmb3IoaW50IGkgPSAxOyBpIDwgbTsgaSsrKXsKICAgIAlmb3IoaW50IGogPSAxOyBqIDw9IG07IGorKyl7CiAgICAJCWEuY1tpZChpLCBqKV1baWQoaSArIDEsIGopXSA9IDE7CiAgICAJfQogICAgfQoJLy8gZm9yKGludCBpID0gMDsgaSA8PSAobSArIDEpICogKG0gKyAxKTsgaSsrKXsKIC8vICAgCWNvdXQgPDwgZHAuY1tpXVswXSA8PCBlbmRsOwogLy8gICB9CiAvLyAgIGZvcihpbnQgaSA9IDA7IGkgPCAobSArIDEpICogKCBtICsgMSk7IGkrKyl7CiAvLyAgIAlmb3IoaW50IGogPSAwOyBqIDwgKG0gKyAxKSAqICggbSArIDEpOyBqKyspY291dCA8PCBhLmNbaV1bal0gPDwgIiAiOwogLy8gICAJY291dCA8PCBlbmRsOwogLy8gICB9CiAvLyAgIGNvdXQgPDwgZW5kbDsKCWlmKG0gPj0gbil7CgkJbG9uZyBsb25nIGFucyA9IDA7CgkJZm9yKGludCBpID0gMTsgaSA8PSBtOyBpKyspIGFucyA9IChhbnMgKyBkcC5jW2lkKG4sIGkpXVswXSkgJSBtb2Q7CgkJY291dCA8PCBhbnM7Cgl9ZWxzZXsKCWEgPSBwb3dlcm1vZChhLCBuIC0gbSkgKiBkcDsKCWxvbmcgbG9uZyBhbnMgPSAwOwogICAgZm9yKGludCBpID0gMTsgaSA8PSBtOyBpKyspIGFucyA9IChhbnMgKyBhLmNbaWQobSwgaSldWzBdKSAlIG1vZDsKICAgIC8vIGZvcihpbnQgaSA9IDA7IGkgPCAobSArIDEpICogKCBtICsgMSk7IGkrKyl7CiAgICAvLyAJZm9yKGludCBqID0gMDsgaiA8IChtICsgMSkgKiAoIG0gKyAxKTsgaisrKWNvdXQgPDwgYS5jW2ldW2pdIDw8ICIgIjsKICAgIC8vIAljb3V0IDw8IGVuZGw7CiAgICAvLyB9CiAgICAKICAgIAogICAgY291dCA8PCBhbnM7fQogICAgCiAgICAKCQogICAgCgkKCS8vIGNvdXQgPDwgYS5jWzBdWzBdOwoKfQ==