#include using namespace std; typedef long long ll; const ll MOD=1e9+7; template class modint{ using u64=uint_fast64_t; public: u64 a; constexpr modint(const u64 x=0) noexcept:a(((x%Modulus)+Modulus)%Modulus){} constexpr u64 &value() noexcept{return a;} constexpr const u64 &value() const noexcept{return a;} constexpr modint &operator+=(const modint &rhs) noexcept{ a+=rhs.a; if (a>=Modulus) a-=Modulus; return *this; } constexpr modint operator+(const modint &rhs) const noexcept{ return modint(*this)+=rhs; } constexpr modint &operator++() noexcept{ return ++a,*this; } constexpr modint operator++(int) noexcept{ modint t=*this; return ++a,t; } constexpr modint &operator-=(const modint &rhs) noexcept{ if (a>=1; } return *this; } constexpr modint operator/(const modint &rhs) const noexcept{ return modint(*this)/=rhs; } constexpr modint operator-() const noexcept{ return modint(Modulus-a); } constexpr bool operator==(const modint &rhs) const noexcept{ return a==rhs.a; } constexpr bool operator!=(const modint &rhs) const noexcept{ return a!=rhs.a; } constexpr bool operator!() const noexcept{return !a;} friend constexpr modint pow(modint rhs,long long exp) noexcept{ modint res{1}; while(exp){ if (exp&1) res*=rhs; rhs*=rhs; exp>>=1; } return res; } template friend constexpr modint operator+(T x,modint y) noexcept{ return modint(x)+y; } template friend constexpr modint operator-(T x,modint y) noexcept{ return modint(x)-y; } template friend constexpr modint operator*(T x,modint y) noexcept{ return modint(x)*y; } template friend constexpr modint operator/(T x,modint y) noexcept{ return modint(x)/y; } friend ostream &operator<<(ostream &s,const modint &rhs) noexcept { return s << rhs.a; } friend istream &operator>>(istream &s,modint &rhs) noexcept { u64 a; rhs=modint{(s >> a,a)}; return s; } }; using mint=modint; const int MAX=5e5+10; vector fac(MAX),finv(MAX),inv(MAX); void COMinit(){ fac[0]=fac[1]=1; finv[0]=finv[1]=1; inv[1]=1; for (int i=2;i struct SegmentTree{ typedef function F; int n; F f; Monoid id; vector dat; SegmentTree(int n_,F f,Monoid id):f(f),id(id){init(n_);} void init(int n_){ n=1; while(n &v){ for (int i=0;i>=1) dat[k]=f(dat[k<<1|0],dat[k<<1|1]); } Monoid query(int a,int b){ if (a>=b) return id; Monoid vl=id,vr=id; for (int l=a+n,r=b+n;l>=1,r>>=1){ if (l&1) vl=f(vl,dat[l++]); if (r&1) vr=f(dat[--r],vr); } return f(vl,vr); } Monoid operator[](int i){ return dat[i+n]; } }; int main(){ cin.tie(0); ios::sync_with_stdio(false); int N,d,K; cin >> N >> d >> K; vector> dp(N+1,vector(K+1,0)); dp[0][0]=1; SegmentTree seg(K+1,[](mint a,mint b){return a+b;},0); seg.update(0,1); for (int i=0;i=0;--j){ dp[i+1][j]+=seg.query(max(0,j-d),j); seg.update(j,dp[i+1][j]); } } cout << dp[N][K] << '\n'; }