#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using ll = long long; using ull = unsigned long long; const ll INF = 1e18; const ll MOD = 1e9 + 7; #define REP(i, n) for(ll i = 0; i < n; i++) template class ModInt { private: public: long long val; constexpr ModInt(long long v = 0) noexcept : val(v % MOD_) { if (val < 0) val += MOD_; } constexpr int getmod() { return MOD_; } constexpr ModInt operator - () const noexcept { return val ? MOD_ - val : 0; } constexpr ModInt operator + (const ModInt& r) const noexcept { return ModInt(*this) += r; } constexpr ModInt operator - (const ModInt& r) const noexcept { return ModInt(*this) -= r; } constexpr ModInt operator * (const ModInt& r) const noexcept { return ModInt(*this) *= r; } constexpr ModInt operator / (const ModInt& r) const noexcept { return ModInt(*this) /= r; } constexpr ModInt operator % (const ModInt& r) const noexcept { return ModInt(*this) %= r; } constexpr ModInt operator ^ (const ModInt& r) const noexcept { return ModInt(*this) ^= r; } constexpr ModInt operator & (const ModInt& r) const noexcept { return ModInt(*this) &= r; } constexpr ModInt operator | (const ModInt& r) const noexcept { return ModInt(*this) |= r; } constexpr ModInt& operator += (const ModInt& r) noexcept { val += r.val; if (val >= MOD_) val -= MOD_; return *this; } constexpr ModInt& operator -= (const ModInt& r) noexcept { val -= r.val; if (val < 0) val += MOD_; return *this; } constexpr ModInt& operator *= (const ModInt& r) noexcept { val = val * r.val % MOD_; return *this; } constexpr ModInt& operator /= (const ModInt& r) noexcept { long long a = r.val, b = MOD_, u = 1, v = 0; while (b) { long long t = a / b; a -= t * b; swap(a, b); u -= t * v; swap(u, v); } val = val * u % MOD_; if (val < 0) val += MOD_; return *this; } constexpr ModInt& operator %= (const ModInt& r) noexcept { assert(r != 0); val = val % r.val; return *this; } constexpr ModInt& operator ^= (const ModInt& r) noexcept { val = (val ^ r.val) % MOD_; return *this; } constexpr ModInt& operator &= (const ModInt& r) noexcept { val = val & r.val; return *this; } constexpr ModInt& operator |= (const ModInt& r) noexcept { val = (val | r.val) % MOD_; return *this; } constexpr bool operator == (const ModInt& r) const noexcept { return this->val == r.val; } constexpr bool operator != (const ModInt& r) const noexcept { return this->val != r.val; } constexpr bool operator < (const ModInt& r) const noexcept { return this->val < r.val; } constexpr bool operator > (const ModInt& r) const noexcept { return this->val > r.val; } constexpr bool operator <= (const ModInt& r) const noexcept { return this->val <= r.val; } constexpr bool operator >= (const ModInt& r) const noexcept { return this->val >= r.val; } constexpr bool operator && (const ModInt& r) const noexcept { return this->val && r.val; } constexpr bool operator || (const ModInt& r) const noexcept { return this->val || r.val; } constexpr ModInt& operator ++ () noexcept { val = (val + 1) % MOD_; return *this; } constexpr ModInt operator ++ (int n) noexcept { ModInt t = *this; val = (val + 1) % MOD_; return t; } constexpr ModInt& operator -- () noexcept { val = (val - 1 + MOD_) % MOD_; return *this; } constexpr ModInt operator -- (int n) noexcept { ModInt t = *this; val = (val - 1 + MOD_) % MOD_; return t; } constexpr ModInt operator ! () noexcept { return val? 1 : 0; } friend constexpr ostream& operator << (ostream &os, const ModInt& x) noexcept { return os << x.val; } friend constexpr istream& operator >> (istream &is, ModInt& x) noexcept { return is >> x.val; } friend constexpr ModInt modpow(const ModInt &a, long long n) noexcept { if (n == 0) return 1; auto t = modpow(a, n / 2); t = t * t; if (n & 1) t = t * a; return t; } }; int main(){ ll n, d, k; cin >> n >> d >> k; vector>> dp(n + 1, vector>(k + 2)); dp[0][0] = 1; dp[0][1] = -1; REP(i, n){ REP(j, k){ if(j > 0){ dp[i][j] += dp[i][j - 1]; } dp[i + 1][j + 1] += dp[i][j]; dp[i + 1][min(j + d + 1, k + 1)] -= dp[i][j]; } } for(ll j = 1; j <= k; j++){ dp[n][j] += dp[n][j - 1]; } cout << dp[n][k] << endl; }