func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long N = 105;   const long long MOD = 1e9 + 7;   long long n, m, k;   long long cache[N][N * N], cache2[N][N];   long long fact[N], invfact[N];   long long pow(long long a, long long b, long long m) {     long long ans = 1;     while (b) {       if (b & 1) ans = (ans * a) % m;       b /= 2;       a = (a * a) % m;     }     return ans;   }   long long modinv(long long k) { return pow(k, MOD - 2, MOD); }   void precompute() {     fact[0] = fact[1] = 1;     for (long long i = 2; i < N; i++) {       fact[i] = fact[i - 1] * i;       fact[i] %= MOD;     }     invfact[N - 1] = modinv(fact[N - 1]);     for (long long i = N - 2; i >= 0; i--) {       invfact[i] = invfact[i + 1] * (i + 1);       invfact[i] %= MOD;     }   }   long long nCr(long long x, long long y) {     if (y > x) return 0;     long long num = fact[x];     num *= invfact[y];     num %= MOD;     num *= invfact[x - y];     num %= MOD;     return num;   }   long long get(long long idx, long long cur) {     long long &ans = cache2[idx][cur];     if (ans != -1) return ans;     long long ways = nCr(n, cur);     long long have = m / n;     if (m % n >= (idx)) have++;     ways = pow(ways, have, MOD);     return ans = ways;   }   long long dp(long long idx, long long rem) {     if (idx == n + 1) return (rem == 0);     long long &ans = cache[idx][rem];     if (ans != -1) return ans;     ans = 0;     for (long long cur = 0; cur <= min(n, rem); cur++) {       long long ways = get(idx, cur);       ans += ways * dp(idx + 1, rem - cur);       ans %= MOD;     }     return ans;   }   int32_t main() {     ios::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     ;     precompute();     memset(cache, -1, sizeof(cache));     memset(cache2, -1, sizeof(cache2));     cin >> n >> m >> k;     cout << dp(1, k);     return 0;   }   