func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long P = (long long)1e9 + 7;   int n, k;   int a[2];   long long c[60][60];   long long cnt[60][60];   int dp[60][60];   struct rmdr {     int i, j;     bool operator<(const rmdr& a) const {       if (50 * i + 100 * j != 50 * a.i + 100 * a.j)         return 50 * i + 100 * j < 50 * a.i + 100 * a.j;       return i > a.i;     }   };   rmdr r[100010];   int sz = 0;   int main() {     cin >> n >> k;     a[0] = a[1] = 0;     for (int i = 0; i < int(n); ++i) {       int tmp;       cin >> tmp;       if (tmp == 50)         a[0]++;       else         a[1]++;     }     memset(c, 0, sizeof(c));     c[0][0] = 1;     for (int i = int(1); i < int(n + 1); ++i) {       c[i][0] = 1;       for (int j = int(1); j < int(i + 1); ++j)         c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % P;     }     memset(cnt, 0, sizeof(cnt));     for (int i = 0; i < int(a[0] + 1); ++i)       for (int j = 0; j < int(a[1] + 1); ++j) dp[i][j] = 100500;     dp[0][0] = 0;     cnt[0][0] = 1;     for (int i = 0; i < int(a[0] + 1); ++i)       for (int j = 0; j < int(a[1] + 1); ++j) {         if (i == 0 && j == 0) continue;         r[sz].i = i, r[sz].j = j;         sz++;       }     sort(r, r + sz);     for (int z = 0; z < int(sz); ++z) {       int i = r[z].i, j = r[z].j;       if (50 * i + 100 * j <= k) {         dp[i][j] = 1;         cnt[i][j] = 1;         continue;       }       for (int i1 = 0; i1 < int(i + 1); ++i1)         for (int j1 = 0; j1 < int(j + 1); ++j1) {           if (i1 == 0 && j1 == 0) continue;           if (50 * i1 + 100 * j1 > k) break;           for (int i2 = 0; i2 < int(a[0] - i + i1 + 1); ++i2)             for (int j2 = 0; j2 < int(a[1] - j + j1 + 1); ++j2) {               if (i2 == 0 && j2 == 0) continue;               if (50 * i2 + 100 * j2 > k) break;               if (dp[i][j] >= dp[i - i1 + i2][j - j1 + j2] + 2) {                 long long tmp = (cnt[i - i1 + i2][j - j1 + j2] * c[i][i1]) % P;                 tmp = (tmp * c[j][j1]) % P;                 tmp = (tmp * c[a[0] - i + i1][i2]) % P;                 tmp = (tmp * c[a[1] - j + j1][j2]) % P;                 if (dp[i][j] > dp[i - i1 + i2][j - j1 + j2] + 2) {                   dp[i][j] = dp[i - i1 + i2][j - j1 + j2] + 2;                   cnt[i][j] = tmp;                 } else                   cnt[i][j] = (cnt[i][j] + tmp) % P;               }             }         }     }     if (dp[a[0]][a[1]] == 100500) {       printf( -1 n0 n );     } else {       printf( %d n%d n , dp[a[0]][a[1]], int(cnt[a[0]][a[1]]));     }     return 0;   }   