func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 105, mod = 1e9 + 7;   int dp[N][N * N];   bool done[N][N * N];   int fact[N], inv[N];   int arr1[N];   int arr2[N];   int n, k;   long long m;   inline int add(int a, int b) {     int res = a + b;     if (res >= mod) res -= mod;     return res;   }   inline int mult(int a, int b) {     long long res = a * 1LL * b;     return res % mod;   }   int powmod(int a, long long b) {     int res = 1;     while (b) {       if (b & 1) {         res = mult(res, a);       }       a = mult(a, a);       b >>= 1;     }     return res;   }   int ncr(int n, int r) {     int res = fact[n];     res = mult(res, inv[r]);     res = mult(res, inv[n - r]);     return res;   }   int solve(int pos, int cnt) {     if (cnt < 0) return 0;     if (pos == n + 1) return (cnt == 0);     if (done[pos][cnt]) return dp[pos][cnt];     if ((n + 1 - pos) * n < cnt) return 0;     long long p = m / n;     bool b = (pos <= m % n);     if (b) {       for (int i = 0; i <= n; i++) {         dp[pos][cnt] = add(mult(solve(pos + 1, cnt - i), arr2[i]), dp[pos][cnt]);       }     } else {       for (int i = 0; i <= n; i++) {         dp[pos][cnt] = add(mult(solve(pos + 1, cnt - i), arr1[i]), dp[pos][cnt]);       }     }     done[pos][cnt] = true;     return dp[pos][cnt];   }   int main() {     scanf( %d %I64d %d , &n, &m, &k);     fact[0] = 1, inv[0] = 1;     long long p = m / n;     for (int i = 1; i < N; i++) {       fact[i] = mult(fact[i - 1], i);       inv[i] = powmod(fact[i], mod - 2);     }     for (int i = 0; i <= n; i++) {       arr1[i] = powmod(ncr(n, i), p);       arr2[i] = powmod(ncr(n, i), p + 1);     }     memset(dp, 0, sizeof(dp));     int ans = solve(1, k);     printf( %d n , ans);   }   