/*
#dynamic programming
*/
/*
f(m, n) = số dãy không giảm x[1...m] có tổng bằng n và max <= k
Nếu x[1] = 0: Số lượng: f(m - 1, n);
Nếu x[1] > 0:
++
+++
+++++
++++++++
*******
Giảm x[1...m] mỗi số đi 1 đơn vị (bỏ hàng *)
Phần còn lại (dấu +) biểu diễn một dãy
. Có m phần tử,
. Tổng bằng n - m
. Max < k
Số lượng = f(m, n - m) - (Số dãy trong f(m, n - m) có max = x[m] = k)
= f(m, n - m) - f(m - 1, n - m - k)
*: Dùng 2 vector 1D để tiết kiệm bộ nhớ và tăng tốc.
*/
#define taskname "GAME"
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int maxMNK = 5001;
const int MOD = 1e9 + 7;
int n, m, k;
vector<int> f, g;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
freopen(taskname".INP", "r", stdin);
freopen(taskname".OUT", "w", stdout);
cin >> n >> m >> k;
f.resize(n + 1, 0); g.resize(n + 1);
f[0] = 1;
for (int i = 1; i <= m; ++i)
{
for (int j = 0; j <= n; ++j)
{
g[j] = f[j];
if (j >= i)
{
g[j] = (g[j] + g[j - i]) % MOD;
if (j - i - k >= 0)
g[j] = (g[j] - f[j - i - k]) % MOD;
}
}
f.swap(g);
}
cout << (f[n] + MOD) % MOD;
}
LyoKI2R5bmFtaWMgcHJvZ3JhbW1pbmcKKi8KLyoKZihtLCBuKSA9IHPhu5EgZMOjeSBraMO0bmcgZ2nhuqNtIHhbMS4uLm1dIGPDsyB04buVbmcgYuG6sW5nIG4gdsOgIG1heCA8PSBrCk7hur91IHhbMV0gPSAwOiBT4buRIGzGsOG7o25nOiBmKG0gLSAxLCBuKTsKTuG6v3UgeFsxXSA+IDA6CiAgICAgICAgICAgICArKwogICAgICAgICAgICArKysKICAgICAgICAgICsrKysrCiAgICAgICArKysrKysrKwogICAgICAqKioqKioqCiAgR2nhuqNtIHhbMS4uLm1dIG3hu5dpIHPhu5EgxJFpIDEgxJHGoW4gduG7iyAoYuG7jyBow6BuZyAqKQogIFBo4bqnbiBjw7JuIGzhuqFpIChk4bqldSArKSBiaeG7g3UgZGnhu4VuIG3hu5l0IGTDo3kKICAuIEPDsyBtIHBo4bqnbiB04butLAogIC4gVOG7lW5nIGLhurFuZyBuIC0gbQogIC4gTWF4IDwgawogIFPhu5EgbMaw4bujbmcgPSBmKG0sIG4gLSBtKSAtIChT4buRIGTDo3kgdHJvbmcgZihtLCBuIC0gbSkgY8OzIG1heCA9IHhbbV0gPSBrKQogICAgICAgICAgID0gZihtLCBuIC0gbSkgLSBmKG0gLSAxLCBuIC0gbSAtIGspCio6IETDuW5nIDIgdmVjdG9yIDFEIMSR4buDIHRp4bq/dCBraeG7h20gYuG7mSBuaOG7myB2w6AgdMSDbmcgdOG7kWMuCiovCiNkZWZpbmUgdGFza25hbWUgIkdBTUUiCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHZlY3Rvcj4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgaW50IG1heE1OSyA9IDUwMDE7CmNvbnN0IGludCBNT0QgPSAxZTkgKyA3OwppbnQgbiwgbSwgazsKdmVjdG9yPGludD4gZiwgZzsKCmludCBtYWluKCkKewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwogICAgZnJlb3Blbih0YXNrbmFtZSIuSU5QIiwgInIiLCBzdGRpbik7CiAgICBmcmVvcGVuKHRhc2tuYW1lIi5PVVQiLCAidyIsIHN0ZG91dCk7CiAgICBjaW4gPj4gbiA+PiBtID4+IGs7CiAgICBmLnJlc2l6ZShuICsgMSwgMCk7IGcucmVzaXplKG4gKyAxKTsKICAgIGZbMF0gPSAxOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbTsgKytpKQogICAgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDw9IG47ICsraikKICAgICAgICB7CiAgICAgICAgICAgIGdbal0gPSBmW2pdOwogICAgICAgICAgICBpZiAoaiA+PSBpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBnW2pdID0gKGdbal0gKyBnW2ogLSBpXSkgJSBNT0Q7CiAgICAgICAgICAgICAgICBpZiAoaiAtIGkgLSBrID49IDApCiAgICAgICAgICAgICAgICAgICAgZ1tqXSA9IChnW2pdIC0gZltqIC0gaSAtIGtdKSAlIE1PRDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmLnN3YXAoZyk7CiAgICB9CiAgICBjb3V0IDw8IChmW25dICsgTU9EKSAlIE1PRDsKfQ==