#include <bits/stdc++.h>
using namespace std;
int N, K, comb[105][105], kalan;
long long int M;
int res, bas, dn[105][10005];
long long int cnt2[105], cnt[105];
long long int fast(int a, long long int b) {
  long long int x = 1, crp2 = a;
  for (long long int i = 1; i <= b; i *= 2) {
    if (b & i) x = (x * crp2) % 1000000007;
    crp2 = (crp2 * crp2) % 1000000007;
  }
  return x;
}
int f(int cur, int last) {
  if (cur == N + 1) return 1;
  if (last == 0) return 1;
  if (dn[cur][last] != -1) return dn[cur][last];
  dn[cur][last] = 0;
  long long int crp;
  for (int i = max(last - (N - cur) * N, 0); i <= min(last, N); i++) {
    if (cur <= M % N)
      crp = cnt[i];
    else
      crp = cnt2[i];
    dn[cur][last] =
        (dn[cur][last] + (f(cur + 1, last - i) * crp) % 1000000007) %
        1000000007;
  }
  return dn[cur][last];
}
int main() {
  cin >> N >> M >> K;
  if (K == 0) {
    printf("1\n");
    return 0;
  }
  for (int i = 0; i <= N; i++) comb[i][0] = 1;
  for (int i = 1; i <= N; i++)
    for (int j = 1; j <= i; j++)
      comb[i][j] = (comb[i - 1][j] + comb[i - 1][j - 1]) % 1000000007;
  memset(dn, -1, sizeof(dn));
  for (int i = 0; i <= N; i++) {
    cnt[i] = fast(comb[N][i], M / N + 1);
    cnt2[i] = fast(comb[N][i], M / N);
  }
  printf("%d\n", f(1, K));
  return 0;
}
