#include <bits/stdc++.h>
const int md = 1e9 + 7;
int n, k, m, M, c;
struct mat {
  int A[256][256];
  inline mat() { memset(A, 0, sizeof A); }
  inline int* operator[](const int& x) { return A[x]; }
  inline mat operator*(const mat& b) const {
    mat c;
    for (int i = 0; i <= M; ++i)
      for (int k = 0; k <= M; ++k)
        for (int j = 0; j <= M; ++j)
          c[i][j] = (c[i][j] + (long long)A[i][k] * b.A[k][j]) % md;
    return c;
  }
} A, B;
inline void pow(mat a, int b) {
  mat& ret = B;
  ret[0][0] = 1;
  for (; b; b >>= 1, a = a * a)
    if (b & 1) ret = ret * a;
}
int main() {
  scanf("%d%d%d", &n, &k, &m), M = (k + 1) << m, c = (1 << m) - 1;
  for (int i = 0; i <= k; ++i) {
    for (int j = 0; j <= c; ++j) A[i << m | j][i << m | ((j << 1) & c)] = 1;
    if (i != k)
      for (int j = 0; j <= c; ++j)
        A[i << m | j][(i + 1) << m | ((j << 1 | 1) & c)] =
            1 + __builtin_popcount(j);
  }
  pow(A, n);
  int ans = 0;
  for (int i = 0; i <= c; ++i) ans = (ans + B[0][k << m | i]) % md;
  printf("%d", ans);
  return 0;
}
