#include using namespace std; #define fs first #define sc second #define mp make_pair #define pb push_back #define eb emplace_back #define ALL(A) A.begin(),A.end() #define RALL(A) A.rbegin(),A.rend() typedef long long LL; typedef pair P; const LL mod=1000000007; const LL LINF=1LL<<60; const int INF=1<<30; int dx[]={1,0,-1,0}; int dy[]={0,1,0,-1}; // Segment Tree Beats // - l<=iupdateall(lval); right->updateall(lval); lval = LINF; return; } if(ladd != 0) { left->addall(ladd); right->addall(ladd); ladd = 0; } if(max_v < left->max_v) { left->update_max(max_v); } if(left->min_v < min_v) { left->update_min(min_v); } if(max_v < right->max_v) { right->update_max(max_v); } if(right->min_v < min_v) { right->update_min(min_v); } } void update() { sum = left->sum + right->sum; if(left->max_v < right->max_v) { max_v = right->max_v; max_c = right->max_c; smax_v = max(left->max_v, right->smax_v); } else if(left->max_v > right->max_v) { max_v = left->max_v; max_c = left->max_c; smax_v = max(left->smax_v, right->max_v); } else { max_v = left->max_v; max_c = left->max_c + right->max_c; smax_v = max(left->smax_v, right->smax_v); } if(left->min_v < right->min_v) { min_v = left->min_v; min_c = left->min_c; smin_v = min(left->smin_v, right->min_v); } else if(left->min_v > right->min_v) { min_v = right->min_v; min_c = right->min_c; smin_v = min(left->min_v, right->smin_v); } else { min_v = left->min_v; min_c = left->min_c + right->min_c; smin_v = min(left->smin_v, right->smin_v); } } }; int n, n0; Node *root; void _update_min(LL x, int a, int b, Node *nd, int l, int r) { if(b <= l || r <= a || nd->max_v <= x) { return; } if(a <= l && r <= b && nd->smax_v < x) { nd->update_max(x); return; } nd->push(); _update_min(x, a, b, nd->left, l, (l+r)/2); _update_min(x, a, b, nd->right, (l+r)/2, r); nd->update(); } void _update_max(LL x, int a, int b, Node *nd, int l, int r) { if(b <= l || r <= a || x <= nd->min_v) { return; } if(a <= l && r <= b && x < nd->smin_v) { nd->update_min(x); return; } nd->push(); _update_max(x, a, b, nd->left, l, (l+r)/2); _update_max(x, a, b, nd->right, (l+r)/2, r); nd->update(); } void _add_val(LL x, int a, int b, Node *nd, int l, int r) { if(b <= l || r <= a) { return; } if(a <= l && r <= b) { nd->addall(x); return; } nd->push(); _add_val(x, a, b, nd->left, l, (l+r)/2); _add_val(x, a, b, nd->right, (l+r)/2, r); nd->update(); } void _update_val(LL x, int a, int b, Node *nd, int l, int r) { if(b <= l || r <= a) { return; } if(a <= l && r <= b) { nd->updateall(x); return; } nd->push(); _update_val(x, a, b, nd->left, l, (l+r)/2); _update_val(x, a, b, nd->right, (l+r)/2, r); nd->update(); } LL _query_max(int a, int b, Node *nd, int l, int r) { if(b <= l || r <= a) { return -LINF; } if(a <= l && r <= b) { return nd->max_v; } nd->push(); LL lv = _query_max(a, b, nd->left, l, (l+r)/2); LL rv = _query_max(a, b, nd->right, (l+r)/2, r); return max(lv, rv); } LL _query_min(int a, int b, Node *nd, int l, int r) { if(b <= l || r <= a) { return LINF; } if(a <= l && r <= b) { return nd->min_v; } nd->push(); LL lv = _query_min(a, b, nd->left, l, (l+r)/2); LL rv = _query_min(a, b, nd->right, (l+r)/2, r); return min(lv, rv); } LL _query_sum(int a, int b, Node *nd, int l, int r) { if(b <= l || r <= a) { return 0; } if(a <= l && r <= b) { return nd->sum; } nd->push(); LL lv = _query_sum(a, b, nd->left, l, (l+r)/2); LL rv = _query_sum(a, b, nd->right, (l+r)/2, r); return lv + rv; } public: SegmentTree(int n, vector a) : n(n) { n0 = 1; while(n0 < n) n0 <<= 1; Node *nds = new Node[2*n0]; root = nds; nds[0].len = n0; for(int i=0; i> 1); } for(int i=0; i=0; i--) nds[i].update(); } void update_min(int a, int b, LL x) { _update_min(x, a, b, root, 0, n0); } void update_max(int a, int b, LL x) { _update_max(x, a, b, root, 0, n0); } void add_val(int a, int b, LL x) { _add_val(x, a, b, root, 0, n0); } void update_val(int a, int b, LL x) { _update_val(x, a, b, root, 0, n0); } LL query_max(int a, int b) { return _query_max(a, b, root, 0, n0); } LL query_min(int a, int b) { return _query_min(a, b, root, 0, n0); } LL query_sum(int a, int b) { return _query_sum(a, b, root, 0, n0); } }; int main(){ int n,d,k;cin >> n >> d >> k; SegmentTree seg(k+d+1, vector (k+d+1,0)); seg.update_val(0,1,1); for (int r = 0; r < n; r++) { for (int i = k; i >= 0; i--) { LL t = seg.query_sum(i,i+1)%mod; seg.add_val(i+1,i+d+1,t); seg.update_val(i,i+1,0); } } cout << seg.query_sum(k,k+1)%mod << endl; return 0; }