#include <bits/stdc++.h>
using namespace std;
bool debug = false;
int n, m, k;
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
long long ln, lk, lm;
long long C[105][105];
void c(int n) {
  C[0][0] = 1;
  for (int i = 1; i <= n; i++) {
    C[i][0] = C[i][i] = 1;
    for (int j = 1; j < i; j++) {
      C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % 1000000007;
    }
  }
}
long long f[2][105][105][105], ans;
void ad(long long &x, long long y) { (x += y) %= 1000000007; }
int main() {
  int K;
  scanf("%d%d%d", &n, &m, &K);
  if (n == 1) {
    puts("0");
    return 0;
  }
  n++;
  c(n);
  f[0][0][1][1] = 1;
  int now = 0;
  for (int i = 0; i <= m; i++) {
    now ^= 1;
    if (i) {
      long long tmp = 0;
      for (int j = 2; j <= n; j++)
        for (int(k) = 1; (k) <= (int)(K); (k)++)
          (tmp += f[now ^ 1][j][0][k]) %= 1000000007;
      (ans += tmp * (m - i + 1) % 1000000007) %= 1000000007;
    }
    memset(f[now], 0, sizeof f[now]);
    for (int j = 0; j <= n; j++) {
      for (int(l) = 1; (l) <= (int)(n); (l)++)
        for (int(k) = 1; (k) <= (int)(K); (k)++)
          if (f[now ^ 1][j][l][k]) {
            for (int t = l; t + j <= n; t++) {
              (f[now][j + t][t - l]
                [min((long long)K + 1, k * C[t - 1][l - 1])] +=
               f[now ^ 1][j][l][k]) %= 1000000007;
            }
          }
    }
  }
  printf("%lld\n", ans);
  return 0;
}
