#include <bits/stdc++.h>
const long long maxn = 110;
const long long maxpfn = 10010;
const long long mo = 1000000007;
long long f[2][maxpfn], C[maxn + 1][maxn + 1], ci[maxn + 1],
    yh[maxn + 1][maxn + 1];
long long n, m, K;
long long result;
long long mi(long long a, long long p) {
  long long b;
  bool first = true;
  b = a;
  while (p) {
    if (p & 1) {
      if (first) {
        first = false;
        a = b;
      } else {
        a = (a * b) % mo;
      }
    }
    b = (b * b) % mo;
    p /= 2;
  }
  return a;
}
void calc_C() {
  long long i, j;
  C[0][0] = 1;
  for (i = 1; i <= n; ++i) {
    C[i][0] = C[i][i] = 1;
    for (j = 1; j < i; ++j) {
      C[i][j] = C[i - 1][j] + C[i - 1][j - 1];
      if (C[i][j] >= mo) C[i][j] -= mo;
    }
  }
}
void init() {
  long long i, j, k;
  scanf("%I64d%I64d%I64d", &n, &m, &K);
  for (i = 1; i <= n; ++i) {
    ci[i] = m / n;
    if (m % n >= i) ++ci[i];
  }
  calc_C();
  for (i = 1; i <= n; ++i)
    for (k = 0; k <= n; ++k) {
      yh[i][k] = mi(C[n][k], ci[i]);
    }
}
void work() {
  long long old, now, i, j, k;
  now = 0;
  for (i = 0; i <= K; ++i) f[now][i] = 0;
  f[now][0] = 1;
  for (i = 1; i <= n; ++i) {
    old = now;
    now = 1 - now;
    for (j = 0; j <= K; ++j) f[now][j] = 0;
    for (k = 0; k <= n; ++k)
      for (j = K - k; j >= 0; --j)
        if (f[old][j]) {
          f[now][j + k] += f[old][j] * yh[i][k];
          f[now][j + k] = f[now][j + k] % mo;
        }
  }
  result = f[now][K];
}
void output() { printf("%I64d\n", result); }
int main() {
  init();
  work();
  output();
  return 0;
}
