#include <bits/stdc++.h>
using namespace std;
int mpow(int base, int exp);
void ipgraph(int m);
void dfs(int u, int par);
const int mod = 1000000007;
const int N = 104, M = N / 2;
const int MAXN = 105;
const int inf = 1000;
int dp[M][M][M][N];
int C[N][N];
int n, m, K;
void read() { cin >> n >> m >> K; }
int main() {
  int i, j, k, l;
  for (i = 0; i < 101; i++) {
    C[i][0] = 1;
    for (j = 1; 1 < i + 1 ? j < i + 1 : j > i + 1; 1 < i + 1 ? j += 1 : j -= 1)
      C[i][j] = min(1000, C[i - 1][j] + C[i - 1][j - 1]);
  }
  int ans = 0;
  dp[0][1][0][1] = 1;
  read();
  int xx = min(n / 2, m - 1);
  for (i = 0; i < 1 + xx; i++) {
    for (j = 1; 1 < n / 2 + 1 ? j < n / 2 + 1 : j > n / 2 + 1;
         1 < n / 2 + 1 ? j += 1 : j -= 1)
      for (k = 0; k < 1 + n / 2; k++)
        for (l = 1; 1 < 1 + K ? l < 1 + K : l > 1 + K;
             1 < 1 + K ? l += 1 : l -= 1) {
          if (i != 0) {
            ans += (dp[i][j][k][l] * (m - i)) % mod;
            if (ans >= mod) ans -= mod;
          }
          for (int s = 1; s + k <= n / 2; s++) {
            int r = l * C[j + s - 1][s];
            if (r <= K) {
              dp[i + 1][s][k + s][r] += dp[i][j][k][l];
              dp[i + 1][s][k + s][r] %= mod;
            }
          }
        }
  }
  cout << ans << endl;
  return 0;
}
int mpow(int base, int exp) {
  base %= mod;
  int result = 1;
  while (exp > 0) {
    if (exp & 1) result = ((long long)result * base) % mod;
    base = ((long long)base * base) % mod;
    exp >>= 1;
  }
  return result;
}
void ipgraph(int m) {
  int i, u, v;
  for (i = 0; i < m; i++) {
    cin >> u >> v;
    u++, v++;
  }
}
void dfs(int u, int par) {
  vector<int> g[3];
  for (int v : g[u]) {
    if (v == par) continue;
    dfs(v, u);
  }
}
