#include <bits/stdc++.h>
using namespace std;
int ntest = 0, test = 0;
inline void init();
inline void run();
inline void stop() { ntest = test - 1; }
int main() {
  init();
  while (++test <= ntest) {
    run();
  }
  return 0;
}
const int INF = (int)1E9 + 5;
const double EPS = 1E-11;
const long long MOD = (long long)1E9 + 7;
const int dx[] = {-1, 0, 0, 1};
const int dy[] = {0, -1, 1, 0};
long long c[1005][1005];
inline void init() {
  ntest = 1;
  for (int i = 0; i < (1001); i++)
    for (int j = 0; j < (1001); j++) c[i][j] = 0;
  for (int i = 0; i < (1001); i++) c[0][i] = 1;
  for (int i = (1); i <= (1000); i++)
    for (int j = (i); j <= (1000); j++) {
      c[i][j] = (c[i - 1][j - 1] + c[i][j - 1]);
      if (c[i][j] > MOD) c[i][j] -= MOD;
    }
}
long long power(long long x, long long n) {
  if (n == 0) return 1;
  long long y = power(x, n / 2);
  y = y * y % MOD;
  if (n % 2 == 1) y = y * x % MOD;
  return y;
}
long long part[1005];
long long dp[105][10109];
long long a[1005];
inline void run() {
  long long n, m, k;
  cin >> n >> m >> k;
  for (int i = 0; i < (105); i++)
    for (int j = 0; j < (10105); j++) dp[i][j] = 0;
  dp[0][0] = 1;
  for (int i = 0; i < (n); i++) {
    long long p = (m - 1 - i + n) / n;
    for (int x = 0; x < (n + 1); x++) a[x] = power(c[x][n], p);
    for (int j = 0; j < (n * n + 1); j++) {
      for (int x = 0; x < (n + 1); x++) {
        if (dp[i][j] > 0) {
          dp[i + 1][j + x] = (dp[i + 1][j + x] + (dp[i][j] * a[x]) % MOD);
          if (dp[i + 1][j + x] > MOD) dp[i + 1][j + x] -= MOD;
        }
      }
    }
  }
  cout << dp[n][k] << endl;
}
