#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 10;
const long long int INFLL = 1e18 + 10;
const long double EPS = 1e-8;
const long double EPSLD = 1e-14;
const long long int MOD = 1000000007;
template <class T>
T &chmin(T &a, const T &b) {
  return a = min(a, b);
}
template <class T>
T &chmax(T &a, const T &b) {
  return a = max(a, b);
}
struct Mod {
  unsigned n;
  Mod() {}
  Mod(long long int x) {
    if (x < 0)
      n = x % MOD + MOD;
    else
      n = x % MOD;
  }
};
Mod operator+(Mod a, Mod b) { return Mod(a.n + b.n); }
Mod operator+=(Mod &a, Mod b) { return a = a + b; }
Mod operator-(Mod a, Mod b) { return Mod(a.n + MOD - b.n); }
Mod operator-=(Mod &a, Mod b) { return a = a - b; }
Mod operator*(Mod a, Mod b) { return Mod((long long int)a.n * b.n); }
Mod operator*=(Mod &a, Mod b) { return a = a * b; }
Mod modpow(Mod x, long long int k) {
  Mod res = 1;
  while (k) {
    if (k & 1) res *= x;
    k /= 2;
    x *= x;
  }
  return res;
}
Mod inv(Mod a) { return modpow(a, MOD - 2); }
Mod operator/(Mod a, Mod b) { return Mod((long long int)a.n * inv(b).n); }
Mod operator/=(Mod &a, Mod b) { return a = a / b; }
class Comb : public vector<vector<Mod> > {
 public:
  Comb(int max_n) {
    resize(max_n, vector<Mod>(max_n));
    for (int i = (0); i < (int)(max_n); i++) {
      at(i).at(0) = at(i).at(i) = 1;
      for (int j = (1); j < (int)(i); j++)
        at(i).at(j) = at(i - 1).at(j - 1) + at(i - 1).at(j);
    }
  }
};
const int MAX_N = 128;
Comb comb(MAX_N);
Mod dp[MAX_N][MAX_N * MAX_N];
long long int n, m, l;
Mod powres[MAX_N][2];
int main() {
  cin >> n >> m >> l;
  for (int i = (0); i < (int)(n + 1); i++) {
    powres[i][0] = modpow(comb[n][i], m / n);
    powres[i][1] = modpow(comb[n][i], m / n + 1);
  }
  dp[0][0] = 1;
  for (int i = (0); i < (int)(n); i++) {
    int p = 0;
    if (i < m % n) p = 1;
    for (int j = (0); j < (int)(l + 1); j++)
      for (int k = (0); k < (int)(n + 1); k++)
        dp[i + 1][j + k] += dp[i][j] * powres[k][p];
  }
  cout << dp[n][l].n << endl;
  return 0;
}
