#include <bits/stdc++.h>
class Input {
 private:
  char buf[1000000], *p1, *p2;

 public:
  inline char getc() {
    if (p1 == p2) p2 = (p1 = buf) + fread(buf, 1, 1000000, stdin);
    return p1 == p2 ? EOF : *(p1++);
  }
  template <typename tp>
  inline Input &operator>>(tp &n) {
    n = 0;
    char c = getc();
    while (!isdigit(c)) c = getc();
    while (isdigit(c)) n = n * 10 + c - 48, c = getc();
    return (*this);
  }
} fin;
const int N = 1e2 + 5, mod = 1e9 + 7;
using namespace std;
int n, m, K;
int c[N][N];
int f[2][N][N][N];
inline void Plus(int &a, int b) { a += b - mod, a += ((a >> 31) & mod); }
void prework(int n) {
  c[0][0] = 1;
  for (int i = 1; i <= n; c[i][0] = 1, ++i)
    for (int j = 1; j <= i; ++j) {
      c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
      if (c[i][j] > K || c[i - 1][j - 1] == -1 || c[i - 1][j] == -1)
        c[i][j] = -1;
    }
}
int main() {
  fin >> n >> m >> K;
  ++n;
  prework(100);
  int ans = 0;
  for (int i = 2; i <= n; ++i) f[1][i][i - 1][1] = 1;
  for (int i = 1; i < m; ++i) {
    int p = i & 1, q = p ^ 1;
    memset(f[q], 0, sizeof f[q]);
    for (int j = 2; j <= n; ++j)
      for (int k = 1; k < j; ++k)
        for (int d = 1; d <= K; ++d)
          if (f[p][j][k][d])
            for (int l = k; j + l <= n; ++l)
              if (~c[l - 1][k - 1])
                Plus(f[q][j + l][l - k][min(K + 1, d * c[l - 1][k - 1])],
                     f[p][j][k][d]);
    for (int j = 2; j <= n; ++j)
      for (int l = 1; l <= K; ++l)
        Plus(ans, 1ll * f[q][j][0][l] * (m - i) % mod);
  }
  cout << ans << endl;
  return 0;
}
