#include <bits/stdc++.h>
using namespace std;
template <typename Tp>
void read(Tp &x) {
  x = 0;
  int op = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') op = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  x *= op;
}
template <typename Tp>
void CMax(Tp &x, Tp y) {
  if (y > x) x = y;
}
template <typename Tp>
void CMin(Tp &x, Tp y) {
  if (y < x) x = y;
}
const int SZ = 105;
const int Mod = 1000000007;
int Pls(int x, int y) {
  x += y;
  if (x >= Mod) x -= Mod;
  return x;
}
void Plus(int &x, int y) {
  x += y;
  if (x >= Mod) x -= Mod;
}
int N, M, K;
int binom[SZ][SZ];
void process() {
  for (int i = 0; i <= N; ++i) {
    binom[i][0] = 1;
    for (int j = 1; j <= i; ++j) {
      binom[i][j] = binom[i - 1][j] + binom[i - 1][j - 1];
      if (binom[i][j] > K) binom[i][j] = K + 1;
    }
  }
}
int f[2][SZ][SZ][SZ], ans;
int main() {
  int cr, nx;
  read(N);
  read(M);
  read(K);
  N++;
  process();
  f[0][0][1][1] = 1;
  for (int i = 0; i < M; ++i) {
    cr = i & 1;
    nx = (i + 1) & 1;
    memset(f[nx], 0, sizeof(f[nx]));
    for (int j = (0); j <= (N); ++j)
      for (int k = (1); k <= (N); ++k)
        for (int x = (1); x <= (K); ++x)
          if (f[cr][j][k][x]) {
            for (int d = k; j + d <= N; ++d)
              if (x * binom[d - 1][k - 1] <= K) {
                Plus(f[nx][j + d][d - k][x * binom[d - 1][k - 1]],
                     f[cr][j][k][x]);
              }
          }
    int res = 0;
    for (int j = (2); j <= (N); ++j)
      for (int x = (1); x <= (K); ++x) res = Pls(res, f[nx][j][0][x]);
    ans = Pls(ans, 1ll * (M - i) * res % Mod);
  }
  printf("%d", ans);
  return 0;
}
