#include <bits/stdc++.h>
using namespace std;
int gi() {
  int x = 0, w = 1;
  char ch = getchar();
  while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
  if (ch == '-') w = 0, ch = getchar();
  while (ch >= '0' && ch <= '9')
    x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
  return w ? x : -x;
}
const int mod = 1e9 + 7;
int n, k, m, inv[15], dis[15], val[15][105], dp[15][15][105], ans;
void Inc(int &x, int y) {
  x += y;
  x >= mod ? x -= mod : x;
}
int C(int x, int y) {
  if (x < y) return 0;
  int res = 1;
  for (int i = 1; i <= y; ++i)
    res = 1ll * res * (x - i + 1) % mod * inv[i] % mod;
  return res;
}
void dfs(int x, int y, int z) {
  Inc(val[x][dis[x]], z);
  if (x == k) return;
  for (int i = 1; i <= m; ++i) {
    dis[x + 1] = dis[x] + i;
    while (dis[y] + m < dis[x + 1]) ++y;
    dfs(x + 1, y, 1ll * z * (x - y + 2) % mod);
  }
}
int main() {
  inv[1] = 1;
  for (int i = 2; i < 15; ++i)
    inv[i] = 1ll * inv[mod % i] * (mod - mod / i) % mod;
  n = gi();
  k = gi();
  m = gi();
  dfs(dis[1] = 1, 1, 1);
  dp[0][0][0] = 1;
  for (int i = 0; i < k; ++i)
    for (int j = 0; j < k; ++j)
      for (int l = 0; l <= 100; ++l)
        if (dp[i][j][l])
          for (int x = 1; j + x <= k; ++x)
            for (int y = 1; l + y <= 100; ++y)
              if (val[x][y])
                Inc(dp[i + 1][j + x][l + y + (i ? m : 0)],
                    1ll * dp[i][j][l] * val[x][y] % mod);
  for (int i = 1; i <= k; ++i)
    for (int j = 1; j <= 100; ++j)
      if (dp[i][k][j]) Inc(ans, 1ll * dp[i][k][j] * C(n - j + i, i) % mod);
  printf("%d\n", ans);
  return 0;
}
