#include <bits/stdc++.h>
using namespace std;
const int NMax = 105, MMax = 55, INF = 1000000007;
int N, M, K;
int dp[MMax][NMax][MMax][NMax], C[NMax][NMax], Q[NMax][NMax];
int main() {
  scanf("%d%d%d", &N, &M, &K);
  for (int i = 0; i <= 100; i++) {
    C[i][0] = 1;
    for (int j = 1; j <= i; j++) {
      C[i][j] = C[i - 1][j] + C[i - 1][j - 1];
      if (C[i][j] > 200) C[i][j] = 200;
    }
  }
  for (int i = 0; i <= 100; i++)
    for (int j = 0; j <= 100; j++) {
      if (i == 0 || j == 0) {
        Q[i][j] = 1;
        continue;
      }
      for (int k = 0; k < i; k++) {
        if (C[i][k] * C[j - 1][i - k - 1] >= 200) {
          Q[i][j] = 200;
          break;
        }
        Q[i][j] = Q[i][j] + C[i][k] * C[j - 1][i - k - 1];
        if (Q[i][j] >= 200) {
          Q[i][j] = 200;
          break;
        }
      }
    }
  for (int i = 0; i <= 10; i++) {
    for (int j = 0; j <= 10; j++) {
    }
  }
  dp[1][0][0][1] = 1;
  int ret = 0;
  for (int i = 1; i <= min(M, N / 2 + 1); i++) {
    for (int j = 0; j <= N; j++) {
      for (int k = 0; k <= (N + 1) / 2; k++) {
        for (int l = 1; l <= K; l++) {
          int s = dp[i][j][k][l];
          if (!s) continue;
          if (j > 0)
            ret = (ret + (int)(((long long)(M - i + 1) * (long long)s) %
                               (long long)INF)) %
                  INF;
          for (int d = 1; d <= (N + 1) / 2; d++) {
            if (d * 2 + j > N) break;
            int way = l * Q[k][d];
            if (way <= K) {
              int t = dp[i + 1][d * 2 + j][d][way];
              dp[i + 1][d * 2 + j][d][way] = (t + dp[i][j][k][l]) % INF;
            }
          }
        }
      }
    }
  }
  printf("%d\n", ret);
  return 0;
}
