#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:102400000,102400000")
using std::bitset;
using namespace std;
long long C[102][102], g[102], gg[102], ynum;
long long dp[102][102 * 102];
long long n, m, k;
long long PowMod(long long m, long long n, long long p) {
  long long ans = 1;
  for (; n; n >>= 1) {
    if (n & 1) ans = (ans * m) % p;
    m = (m * m) % p;
  }
  return ans;
}
void init() {
  long long i, j, tem;
  for (i = 0; i <= 100; i++) {
    C[i][0] = 1;
    for (j = 1; j <= i; j++)
      C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % 1000000007;
  }
  if (k > n * n - k) k = n * n - k;
  ynum = m % n;
  for (i = 0; i <= n; i++) {
    g[i] = PowMod(C[n][i], m / n, 1000000007);
    gg[i] = g[i] * C[n][i] % 1000000007;
  }
}
long long f(long long i) { return m / n + ((m % n) >= i); }
long long dfs(long long i, long long j) {
  long long s, tem, ans = 0, tt;
  if (dp[i][j] != -1) return dp[i][j];
  if (i == 0) return j == 0;
  long long mm = max(0ll, j - n);
  for (s = mm; s <= j; s++) {
    tem = dfs(i - 1, s);
    if (tem != 0) {
      if (i <= ynum)
        tt = gg[j - s];
      else
        tt = g[j - s];
      ans = (ans + tem * tt) % 1000000007;
    }
  }
  return dp[i][j] = ans;
}
int main() {
  long long i, j, tem, ans;
  scanf("%I64d%I64d%I64d", &n, &m, &k);
  init();
  memset(dp, -1, sizeof(dp));
  ;
  ans = dfs(n, k);
  printf("%I64d\n", ans);
  return 0;
}
