#include <bits/stdc++.h>
using namespace std;
struct Edge {
  int u, v, c;
};
const int Maxn = 55, Maxm = 20000, Mo = 1000000007, oo = INT_MAX >> 2;
typedef int Arr[Maxn];
int T, n, m, k, i, j;
int c[55][55], ans, f[55][55][55][105];
void add(int &a, int b) {
  a += b;
  if (a >= Mo) a -= Mo;
}
int main() {
  ios::sync_with_stdio(0);
  cin >> n >> m >> k;
  for (i = 0; i <= n / 2 + 1; i++) c[i][0] = 1;
  for (i = 1; i <= n / 2 + 1; i++)
    for (j = 1; j <= i; j++)
      c[i][j] = min(k + 1, c[i - 1][j - 1] + c[i - 1][j]);
  for (i = 1; i <= n / 2; i += 1) f[2][i][i][1] = 1;
  for (i = 2; i <= n / 2 + 1 && i <= m; i++)
    for (int ct = 1; ct <= n / 2; ct++)
      for (int ln = 1; ln <= n / 2; ln++)
        for (int way = 1; way <= k; way++) {
          int now = f[i][ct][ln][way];
          if (now == 0) continue;
          add(ans, (long long)now * (m - i + 1) % Mo);
          for (int nt = 1; ct + nt <= n / 2; nt++) {
            int nway = way * c[ln + nt - 1][nt];
            if (nway > k) continue;
            add(f[i + 1][ct + nt][nt][nway], now);
          }
        }
  cout << ans << endl;
  return 0;
}
