#include <bits/stdc++.h>
using namespace std;
const int maxn = 101;
long long n, m, k;
long long fact[maxn], rfact[maxn];
bool ex[maxn][maxn * maxn];
long long dp[maxn][maxn * maxn];
bool pex[maxn];
int sp[maxn];
long long po(long long a, long long b) {
  if (!b) return 1;
  long long t = po(a, b / 2);
  t = (t * t) % ((long long)1e9 + 7);
  if (b % 2 == 1) t *= a;
  return t % ((long long)1e9 + 7);
}
long long c(long long k, long long n) {
  long long t = fact[n];
  long long t1 = (rfact[k] * rfact[n - k]) % ((long long)1e9 + 7);
  return (t * t1) % ((long long)1e9 + 7);
}
long long po2(long long k, long long b) {
  if (pex[k]) return sp[k];
  pex[k] = true;
  sp[k] = po(c(k, n), b);
  return sp[k];
}
long long dfs(long long v, long long d) {
  if (v == n && !d) return 1;
  if (v == n) return 0;
  if (ex[v][d]) return dp[v][d];
  long long sum = 0;
  for (int i = min(n, d); i >= 0 && (n - v - 1) * n >= d - i; i--) {
    long long t = dfs(v + 1, d - i) * po2(i, m / n);
    t %= ((long long)1e9 + 7);
    if (m % n > v) t *= c(i, n);
    sum += t % ((long long)1e9 + 7);
    sum %= ((long long)1e9 + 7);
  }
  ex[v][d] = true;
  dp[v][d] = sum;
  return sum;
}
int main() {
  cin >> n >> m >> k;
  if (k > n * n) {
    cout << 0;
    return 0;
  }
  fact[0] = 1;
  for (int i = 1; i < maxn; i++)
    fact[i] = (i * fact[i - 1]) % ((long long)1e9 + 7);
  for (int i = 0; i < maxn; i++)
    rfact[i] = po(fact[i], ((long long)1e9 + 7) - 2);
  cout << dfs(0, k);
}
