#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const int K = 14;
const int M = 4;
const int N = 1e9 + 2;
const int LOG = 30;
int matrix[LOG][K * (1 << M)][K * (1 << M)], dp[K * (1 << M)], num, lim,
    dp1[K * (1 << M)];
int idx(int x, int y) { return x * ((1 << lim)) + y; }
void add(int &x, int y) {
  x += y;
  if (x >= mod) {
    x -= mod;
  }
}
int mul(int x, int y) { return (1ll * x * y) % mod; }
signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n, i, j, k, l, max1, z, t, ans = 0;
  cin >> n >> num >> lim;
  max1 = (num + 1) * (1 << lim);
  dp[0] = 1;
  for (i = 0; i <= num; i++) {
    for (j = 0; j < (1 << lim); j++) {
      k = (j << 1);
      if (k >= (1 << lim)) {
        k -= (1 << lim);
      }
      z = idx(i, j);
      t = idx(i, k);
      matrix[0][z][t]++;
      if (i == num) {
        continue;
      }
      k = ((j << 1) | 1);
      if (k >= (1 << lim)) {
        k -= (1 << lim);
      }
      z = idx(i, j);
      t = idx(i + 1, k);
      matrix[0][z][t] += (__builtin_popcount(j) + 1);
    }
  }
  for (i = 0; i < LOG; i++) {
    if (i) {
      for (j = 0; j < max1; j++) {
        for (k = 0; k < max1; k++) {
          for (l = 0; l < max1; l++) {
            add(matrix[i][j][k], mul(matrix[i - 1][j][l], matrix[i - 1][l][k]));
          }
        }
      }
    }
    if (((1 << i) & n)) {
      for (j = 0; j < max1; j++) {
        dp1[j] = 0;
        for (k = 0; k < max1; k++) {
          add(dp1[j], mul(dp[k], matrix[i][k][j]));
        }
      }
      for (j = 0; j < max1; j++) {
        dp[j] = dp1[j];
      }
    }
  }
  for (i = 0; i < (1 << lim); i++) {
    j = idx(num, i);
    add(ans, dp[j]);
  }
  cout << ans;
}
