#include <bits/stdc++.h>
using namespace std;
long long pwr(long long base, long long p, long long mod = (1000000007LL)) {
  long long ans = 1;
  while (p) {
    if (p & 1) ans = (ans * base) % mod;
    base = (base * base) % mod;
    p /= 2;
  }
  return ans;
}
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
int n, k;
long long m, total[2], ncr[102][102], DP[102][102 * 102], precalc[102][2];
long long dp(int col, int rem) {
  if (rem == 0) return 1;
  if (col == n + 1) return 0;
  if (DP[col][rem] != -1) return DP[col][rem];
  int type = 0;
  if (m % n >= col) type = 1;
  long long ans = 0;
  for (int i = 0; i <= min(n, rem); i++)
    ans = (ans + (precalc[i][type] * dp(col + 1, rem - i)) % (1000000007LL)) %
          (1000000007LL);
  return DP[col][rem] = ans;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n >> m >> k;
  ncr[0][0] = 1;
  for (int i = 1; i <= n; i++) {
    ncr[i][0] = 1;
    for (int j = 1; j <= i; j++)
      ncr[i][j] = (ncr[i - 1][j] + ncr[i - 1][j - 1]) % (1000000007LL);
  }
  total[0] = m / n;
  total[1] = m / n + 1;
  for (int i = 0; i <= n; i++) {
    precalc[i][0] = pwr(ncr[n][i], total[0]);
    precalc[i][1] = pwr(ncr[n][i], total[1]);
  }
  memset(DP, -1, sizeof(DP));
  cout << dp(1, k);
  return 0;
}
