#include <bits/stdc++.h>
namespace Rstd {
using namespace std;
template <typename T>
inline bool chkmax(T &x, T y) {
  return x < y ? x = y, 1 : 0;
}
template <typename T>
inline bool chkmin(T &x, T y) {
  return x > y ? x = y, 1 : 0;
}
template <typename T>
inline void read(T &x) {
  char c = getchar();
  x = 0;
  bool f = 0;
  while (c < '0' || c > '9') f |= (c == '-'), c = getchar();
  while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0', c = getchar();
  x = f ? -x : x;
}
void file() {}
}  // namespace Rstd
using namespace Rstd;
long long C[105][105], dp[105][105 * 105], n, m, k;
long long qpow(long long x, long long tim) {
  long long res = 1;
  while (tim) {
    if (tim & 1) res = (res * x) % 1000000007;
    x = (x * x) % 1000000007;
    tim >>= 1;
  }
  return res;
}
signed main() {
  file();
  read(n);
  read(m);
  read(k);
  for (long long i = 1; i <= n; i++) C[i][0] = C[i][i] = 1, C[i][1] = i;
  for (long long i = 2; i <= n; i++)
    for (long long j = 2; j < i; j++)
      C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % 1000000007;
  long long res = (m % n == 0) ? n : m % n;
  long long times = m / n + (m % n != 0);
  for (long long i = 0; i <= n; i++) dp[i][0] = 1;
  for (long long i = 1; i <= n; i++) {
    for (long long j = 0, tmp; j <= min(n, k); j++) {
      if (i <= res)
        tmp = qpow(C[n][j], times);
      else
        tmp = qpow(C[n][j], times - 1);
      for (long long l = j; l <= k; l++)
        if (l) {
          dp[i][l] =
              (dp[i][l] + dp[i - 1][l - j] * tmp % 1000000007) % 1000000007;
        }
    }
  }
  printf("%lld", dp[n][k]);
  return 0;
}
