#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
const int MAX = 105;
const int MOD = 1e9 + 7;
const int64_t INF = INT_MAX;
const int64_t _INF = INT_MIN;
int64_t n, m, k, md, dv;
int64_t fac[MAX], infac[MAX], pw[MAX][2], total[MAX][MAX * MAX];
int64_t Pow(int64_t a, int64_t b) {
  if (a == 1 || a == 0) return a;
  int64_t curr = 1;
  while (b > 0) {
    if (b % 2 != 0) curr = (curr * a) % MOD;
    a = (a * a) % MOD;
    b /= 2;
  }
  return curr;
}
int64_t nCr(int64_t a, int64_t b) {
  return (((fac[a] * infac[a - b]) % MOD) * infac[b]) % MOD;
}
void precompute() {
  fac[0] = 1;
  for (int i = 1; i <= n; i++) fac[i] = (i * fac[i - 1]) % MOD;
  infac[n] = Pow(fac[n], MOD - 2);
  for (int i = n - 1; i >= 0; i--) infac[i] = ((i + 1) * infac[i + 1]) % MOD;
  dv = m / n;
  md = m % n;
  int mid = n / 2;
  for (int i = 0; i <= mid; i++) {
    int64_t temp = nCr(n, i);
    pw[i][0] = Pow(temp, dv);
    pw[i][1] = (pw[i][0] * temp) % MOD;
  }
}
int64_t solve() {
  total[0][0] = 1;
  for (int p = 1; p <= n; p++) {
    total[p][0] = 1;
    for (int cnt = 1; cnt <= k; cnt++) {
      int64_t curr = 0;
      int temp = n / 2;
      for (int x = 0; x <= temp; x++) {
        if (x > cnt) break;
        int64_t val = pw[x][(p <= md)];
        curr = (curr + ((val * total[p - 1][cnt - x]) % MOD)) % MOD;
        if ((n - x) <= cnt && 2 * x != n)
          curr = (curr + ((val * total[p - 1][cnt - (n - x)]) % MOD)) % MOD;
      }
      total[p][cnt] = curr;
    }
  }
  return total[n][k];
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m >> k;
  precompute();
  cout << solve();
}
