#include <bits/stdc++.h>
const int N = 110;
const int MOD = 1000000007;
inline void add(int &x, int y) { x = (x + y >= MOD) ? x + y - MOD : x + y; }
int n, m, K;
int f[2][N][N][N], g[N][N], last, now, c[N][N];
int main() {
  scanf("%d %d %d", &n, &m, &K), n++;
  g[0][0] = 1;
  for (int i = 1; i <= K; i++) {
    for (int j = 1; j <= K; j++) {
      for (int p = 0; p < i; p++) {
        g[i][j] += g[p][j - 1];
      }
      if (g[i][j] > K) g[i][j] = K + 1;
    }
  }
  c[0][0] = 1;
  for (int i = 1; i <= K; i++)
    for (int j = 0; j <= i; j++) {
      c[i][j] = (j ? c[i - 1][j - 1] : 0) + c[i - 1][j];
      if (c[i][j] > K) c[i][j] = K + 1;
    }
  int ans = 0;
  now = 1, last = 0;
  f[now][0][1][1] = 1;
  for (int i = 0; i <= m; i++) {
    last = now, now ^= 1;
    if (i != 0) {
      int tmp = 0;
      for (int j = 2; j <= n; j++) {
        for (int l = 1; l <= K; l++) {
          add(tmp, f[last][j][0][l]);
        }
      }
      add(ans, (long long)tmp * (m - i + 1) % MOD);
    }
    if (i == m) break;
    memset(f[now], 0, sizeof(f[now]));
    for (int j = 0; j <= n; j++)
      for (int k = 1; k <= n; k++)
        for (int l = 1; l <= K; l++)
          if (f[last][j][k][l])
            for (int t = k; t <= n - j; t++)
              if (l * g[t][k] <= K) {
                add(f[now][j + t][t - k][l * g[t][k]], f[last][j][k][l]);
              }
  }
  printf("%d", ans);
  return 0;
}
