#include <bits/stdc++.h>
using namespace std;
const long long DELTA = 1000000007, maxn = 100 + 7;
long long k, m, n, ans[maxn][maxn * maxn], chooseMem[maxn][maxn],
    powerMem[maxn][2];
;
bool isCeil[maxn];
int power(long long base, long long p) {
  long long ans = 1;
  while (p > 0) {
    if (p % 2) {
      ans *= base;
      ans %= DELTA;
    }
    base *= base;
    base %= DELTA;
    p >>= 1;
  }
  return ans;
}
long long choose(long long r, long long n) {
  if (chooseMem[r][n] != -1) return chooseMem[r][n];
  if (r < 0 or r > n) return 0;
  if (r == 0 or r == n) return 1;
  chooseMem[r][n] = choose(r, n - 1) + choose(r - 1, n - 1);
  chooseMem[r][n] %= DELTA;
  return chooseMem[r][n];
}
int main() {
  cin >> n >> m >> k;
  memset(chooseMem, -1, sizeof chooseMem);
  long long flo = (m / n), cei = (m / n) + 1;
  int r = m % n;
  for (int i = 0; i < n; i++) {
    if (i > 0 and i <= r) {
      isCeil[i] = true;
    }
  }
  for (int i = 0; i <= n; i++) {
    powerMem[i][0] = power(choose(i, n), flo);
    powerMem[i][1] = power(choose(i, n), cei);
  }
  for (int i = 0; i <= n; i++) {
    if (isCeil[1]) {
      ans[1][i] += powerMem[i][1];
      ans[1][i] %= DELTA;
    } else {
      ans[1][i] += powerMem[i][0];
      ans[1][i] %= DELTA;
    }
  }
  for (int i = 2; i <= n; i++) {
    for (int j = 0; j <= (n * n); j++) {
      for (int k = 0; k <= n; k++) {
        if (k <= j) {
          if (isCeil[i]) {
            ans[i][j] += ans[i - 1][j - k] * powerMem[k][1];
            ans[i][j] %= DELTA;
          } else {
            ans[i][j] += ans[i - 1][j - k] * powerMem[k][0];
            ans[i][j] %= DELTA;
          }
        }
      }
    }
  }
  cout << ans[n][k] << endl;
  return 0;
}
