#include <bits/stdc++.h>
using namespace std;
const int N = 105, mod = 1e9 + 7;
int dp[N][N * N];
bool done[N][N * N];
int fact[N], inv[N];
int arr1[N];
int arr2[N];
int n, k;
long long m;
inline int add(int a, int b) {
  int res = a + b;
  if (res >= mod) res -= mod;
  return res;
}
inline int mult(int a, int b) {
  long long res = a * 1LL * b;
  return res % mod;
}
int powmod(int a, long long b) {
  int res = 1;
  while (b) {
    if (b & 1) {
      res = mult(res, a);
    }
    a = mult(a, a);
    b >>= 1;
  }
  return res;
}
int ncr(int n, int r) {
  int res = fact[n];
  res = mult(res, inv[r]);
  res = mult(res, inv[n - r]);
  return res;
}
int solve(int pos, int cnt) {
  if (cnt < 0) return 0;
  if (pos == n + 1) return (cnt == 0);
  if (done[pos][cnt]) return dp[pos][cnt];
  if ((n + 1 - pos) * n < cnt) return 0;
  long long p = m / n;
  bool b = (pos <= m % n);
  if (b) {
    for (int i = 0; i <= n; i++) {
      dp[pos][cnt] = add(mult(solve(pos + 1, cnt - i), arr2[i]), dp[pos][cnt]);
    }
  } else {
    for (int i = 0; i <= n; i++) {
      dp[pos][cnt] = add(mult(solve(pos + 1, cnt - i), arr1[i]), dp[pos][cnt]);
    }
  }
  done[pos][cnt] = true;
  return dp[pos][cnt];
}
int main() {
  scanf("%d %I64d %d", &n, &m, &k);
  fact[0] = 1, inv[0] = 1;
  long long p = m / n;
  for (int i = 1; i < N; i++) {
    fact[i] = mult(fact[i - 1], i);
    inv[i] = powmod(fact[i], mod - 2);
  }
  for (int i = 0; i <= n; i++) {
    arr1[i] = powmod(ncr(n, i), p);
    arr2[i] = powmod(ncr(n, i), p + 1);
  }
  memset(dp, 0, sizeof(dp));
  int ans = solve(1, k);
  printf("%d\n", ans);
}
