#include <bits/stdc++.h>
using namespace std;
long long n, m, limit;
long long dp[2][108][108][108];
long long c[108][108], ans;
void add(long long& x, long long y) { x = (x + y) % 1000000007; }
signed main() {
  c[0][0] = 1;
  for (long long i = 1; i < 108; i++) {
    c[i][0] = 1;
    for (long long j = 1; j <= i; j++) {
      c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
      if (c[i][j] > 108) c[i][j] = 108;
    }
  }
  cin >> n >> m >> limit;
  n++;
  long long now = 0;
  dp[now][0][1][1] = 1;
  for (long long maxi = 1; maxi <= m + 1; maxi++) {
    now ^= 1;
    memset(dp[now], 0, sizeof dp[now]);
    for (long long alr = 2; alr <= n; alr++)
      for (long long ways = 1; ways <= limit; ways++)
        add(ans, (m - maxi + 2) * dp[now ^ 1][alr][0][ways]);
    if (maxi == m + 1) break;
    for (long long alr = 0; alr <= n; alr++)
      for (long long put = 1; put <= n; put++)
        for (long long ways = 1; ways <= limit; ways++)
          if (dp[now ^ 1][alr][put][ways]) {
            for (long long makeup = put; makeup <= n - alr; makeup++)
              if (ways * c[makeup - 1][put - 1] <= limit)
                add(dp[now][alr + makeup][makeup - put]
                      [ways * c[makeup - 1][put - 1]],
                    dp[now ^ 1][alr][put][ways]);
          }
  }
  cout << (ans % 1000000007 + 1000000007) % 1000000007;
  return 0;
}
