#include <bits/stdc++.h>
using namespace std;
double EPS = 1e-9;
int INF = 1e9 + 7;
long long INFF = 1e18L + 7;
double PI = acos(-1);
int dirx[8] = {-1, 0, 0, 1, -1, -1, 1, 1};
int diry[8] = {0, 1, -1, 0, -1, 1, -1, 1};
void solve();
long long power(long long a, long long b);
vector<bool> sieve();
int recursion(int n, int k, vector<int> &memo);
int nonrecursion(int n, int d, vector<int> &memo);
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int t = 1;
  while (t--) {
    solve();
  }
  cerr << "time taken : " << (float)clock() / CLOCKS_PER_SEC << " secs" << endl;
  return 0;
}
void solve() {
  cout << setprecision(12);
  int n, k, d;
  cin >> n >> k >> d;
  vector<int> memo(101, 0);
  int score = recursion(n, k, memo);
  fill(memo.begin(), memo.end(), 0);
  int notscore = nonrecursion(n, d, memo);
  cout << (score - notscore + INF) % INF;
  return;
}
int recursion(int n, int k, vector<int> &memo) {
  if (n >= 0 && memo[n] != 0) {
    return memo[n];
  }
  if (n == 0) {
    return 1;
  } else if (n < 0) {
    return 0;
  }
  for (int i = 1; i < k + 1; i++) {
    memo[n] += recursion(n - i, k, memo);
    memo[n] %= INF;
  }
  return memo[n];
}
int nonrecursion(int n, int d, vector<int> &memo) {
  if (n >= 0 && memo[n] != 0) {
    return memo[n];
  }
  if (n == 0) {
    return 1;
  } else if (n < 0) {
    return 0;
  }
  for (int i = 1; i < d; i++) {
    memo[n] += nonrecursion(n - i, d, memo);
    memo[n] %= INF;
  }
  return memo[n];
}
vector<bool> sieve() {
  vector<bool> primes(1000001, 1);
  primes[0] = 0;
  primes[1] = 0;
  for (long long i = 4; i < 1000001; i += 2) {
    primes[i] = 0;
  }
  for (int i = 3; i * i < 1000001; i += 2) {
    for (long long j = i * i; j < 1000001; j += i) {
      primes[j] = 0;
    }
  }
  return primes;
}
long long power(long long a, long long b) {
  long long result = 1;
  while (b > 0) {
    if (b & 1) {
      result = result * a;
    }
    a = a * a;
    b >>= 1;
  }
  return result;
}
