#include <bits/stdc++.h>
using namespace std;
template <class TAT>
void read(TAT &a) {
  static char cc;
  static bool fff;
  while (((cc = getchar()) < '0' || cc > '9') && cc != '-')
    ;
  if (cc == '-')
    fff = 1, a = 0;
  else
    fff = 0, a = cc - 48;
  while ((cc = getchar()) >= '0' && cc <= '9') a = a * 10 + cc - 48;
  if (fff) a = -a;
}
template <class TAT>
void write(TAT a) {
  static char cc[25];
  static int ct;
  if (a == 0) {
    putchar('0');
    return;
  }
  if (a < 0) {
    putchar('-');
    a = -a;
  }
  ct = 0;
  while (a) {
    cc[++ct] = a % 10 + 48;
    a /= 10;
  }
  while (ct) {
    putchar(cc[ct--]);
  }
}
void begin() {
  freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
}
void end() {
  fclose(stdin);
  fclose(stdout);
}
template <class TAT>
void Ckmin(TAT &a, const TAT &b) {
  if (a > b) a = b;
}
template <class TAT>
void Ckmax(TAT &a, const TAT &b) {
  if (a < b) a = b;
}
const int mod = 1000000007;
const int maxn = 105;
const int maxm = 10005;
long long n, m, K;
long long C[maxn][maxn] = {0};
long long F[maxn][maxm] = {0};
long long P[maxn] = {0};
void Init() { read(n), read(m), read(K); }
int Pow(long long x, long long y) {
  long long S = 1;
  while (y) {
    if (y & 1) S = (S * x) % mod;
    x = (x * x) % mod;
    y >>= 1;
  }
  return S;
}
void Prepare() {
  const int N = 101;
  register int i, j, k;
  C[0][0] = 1;
  for (i = 1; i <= N; ++i) {
    C[i][0] = 1;
    for (j = 1; j <= i; ++j) {
      C[i][j] =
          ((C[i][j - 1] * Pow(j, mod - 2)) % mod * (long long)(i - j + 1)) %
          mod;
    }
  }
}
void Solve() {
  register int i, j, k;
  memset(F, 0, sizeof(F));
  F[0][0] = 1;
  for (i = 1; i <= n; ++i) {
    for (j = 0; j <= n; ++j) P[j] = Pow(C[n][j], (m + n - i) / n) % mod;
    for (j = 0; j <= K; ++j) {
      for (k = j; k <= K && k <= j + n; ++k) {
        F[i][k] = (F[i][k] + F[i - 1][j] * P[k - j]) % mod;
      }
    }
  }
  write(F[n][K]);
  putchar('\n');
}
int main() {
  Init();
  Prepare();
  Solve();
  return 0;
}
