#include <bits/stdc++.h>
using namespace std;
const long long M = 1000000007;
void Cnk(int n, vector<long long>& output) {
  long long r = 1;
  static long long Cprev[10001];
  memset(Cprev, 0, sizeof(Cprev));
  for (int i = 0; i < 10001; ++i) {
    Cprev[i] = 1;
  }
  static long long Cnext[10001];
  for (int j = 1; j <= n; ++j) {
    output[0] = 1ll;
    output[j] = 1ll;
    for (int i = 1; i <= j / 2; ++i) {
      output[i] = (Cprev[i] + Cprev[i - 1]) % M;
      output[j - i] = output[i];
      Cprev[i - 1] = output[i - 1];
      Cprev[j - i + 1] = output[i - 1];
    }
    Cprev[j / 2] = output[j / 2];
    Cprev[j - j / 2] = output[j / 2];
    Cprev[j] = output[j];
  }
}
long long my_pow(long long b, long long n) {
  if (n == 0) return 1ll;
  if (n % 2) {
    return (b * my_pow(b, n - 1)) % M;
  } else {
    long long n2 = my_pow(b, n / 2);
    return (n2 * n2) % M;
  }
}
long long DP[101][10001];
void test0() {
  int n = 2, m = 2, k = 2;
  long long answer = 6ll % M;
  vector<long long> o(n * n + 1);
  Cnk(n * n, o);
  long long r1 = o[k];
  assert(r1 == answer % M);
}
void test1() {
  int n = 10, m = 10, k = 10;
  long long answer = 17310309456440ll % M;
  vector<long long> o(n * n + 1);
  Cnk(n * n, o);
  long long r1 = o[k];
  assert(r1 == answer % M);
}
void test2() {
  int n = 10, m = 20, k = 10;
  long long answer = (17310309456440ll % M) * (17310309456440ll % M) % M;
  vector<long long> o(n + 1);
  Cnk(n * n, o);
  long long cnk = o[k];
  long long r = my_pow(cnk, m / n);
  assert(r == answer % M);
}
int main() {
  int n = 5, k = 24;
  long long m = 6;
  n = 100;
  m = 1000000;
  k = 5000;
  cin >> n >> m >> k;
  vector<vector<long long> > cnk(2, vector<long long>(n + 1, 0ll));
  Cnk(n, cnk[0]);
  cnk[1] = cnk[0];
  for (int i = 0; i < 2; ++i) {
    for (int j = 0; j <= n; ++j) cnk[i][j] = my_pow(cnk[i][j], m / n + i);
  }
  memset(DP, 0, sizeof(DP));
  for (int i1 = 0; i1 <= n; ++i1) {
    DP[i1][0] = 1;
  }
  if (k > n * n / 2) {
    k = n * n - k;
  }
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= k; ++j) {
      for (int k1 = 0; k1 <= min(n, j); ++k1) {
        DP[i][j] += DP[i - 1][j - k1] * cnk[int(i <= m % n)][k1];
        DP[i][j] %= M;
      }
    }
  }
  cout << DP[n][k] << endl;
  return 0;
}
