func_code_string: #include <bits/stdc++.h>   using namespace std;   const int mod = 1000000007, maxn = 110;   int n, k, mat[maxn], fact[maxn], dp[maxn][maxn * maxn], stup[maxn][maxn];   long long m;   int pot(int a, long long b) {     if (!b) {       return 1;     }     if (b == 1) {       return a;     }     int rek, ost;     rek = pot(a, b >> 1);     ost = pot(a, b & 1);     return ((((long long)rek * rek) % mod) * (long long)ost) % mod;   }   int rek(int cur, int ost) {     if (!ost) {       return dp[cur][ost] = 1;     }     if (cur >= n || ost < 0) {       return 0;     }     if (dp[cur][ost] != -1) {       return dp[cur][ost];     }     dp[cur][ost] = 0;     for (int i = 0; i <= min(n, ost); i++) {       dp[cur][ost] += ((long long)stup[cur][i] * rek(cur + 1, ost - i)) % mod;       if (dp[cur][ost] >= mod) {         dp[cur][ost] -= mod;       }     }     return dp[cur][ost];   }   int main(void) {     scanf( %d , &n);     cin >> m;     scanf( %d , &k);     fact[0] = 1;     for (int i = 1; i <= n; i++) {       fact[i] = ((long long)fact[i - 1] * i) % mod;     }     for (int i = 0; i < n; i++) {       for (int j = 0; j <= n; j++) {         stup[i][j] =             pot(((long long)fact[n] *                  pot(((long long)fact[j] * fact[n - j]) % mod, mod - 2)) %                     mod,                 (m - i - 1) / n + 1);       }     }     memset(dp, -1, sizeof dp);     printf( %d n , rek(0, k));     return 0;   }   