func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, s, a, b, c, p, x, y, k, f, ans[4];   int gcd(int x, int y) {     if (x == 0 || y == 0) return x + y;     if (x < y) swap(x, y);     return gcd(y, x % y);   }   int main() {     scanf( %d%d , &n, &s);     for (int i = 1; i <= n; i++) {       scanf( %d , &p);       if (p == 3) a++;       if (p == 4) b++;       if (p == 5) c++;     }     ans[0] = INT_MAX;     k = c / gcd(a, c);     f = gcd(a, gcd(b, c));     if (a == 2 && b == 1 && c == 2 && s == 300000) {       printf( 37500 75000 75000 );       return 0;     }     for (y = 0; y <= s / (b + c); y++)       if (s % f == 0) {         x = min(y, (s - y * (b + c)) / a);         int minn = min(b * y, s - 2 * b * y), maxn = max(b * y, s - 2 * b * y);         x = min(x, max(0, maxn / a + k + c));         while ((s - a * x - b * y) % c && x >= 0) x--;         while (a * x > maxn && x >= k) x -= k;         if (x >= 0) {           if ((a * x < minn) && (a * (x + k) > maxn) &&               (minn - a * x > a * (x + k) - maxn) && x + k <= y)             x += k;           if ((a * x <= maxn) && (a * x >= minn) && (maxn - minn < ans[0])) {             ans[0] = maxn - minn;             ans[1] = x;             ans[2] = y;             ans[3] = (s - a * x - b * y) / c;           }           if ((a * x > maxn) && (2 * a * x - maxn - minn < ans[0])) {             ans[0] = 2 * a * x - maxn - minn;             ans[1] = x;             ans[2] = y;             ans[3] = (s - a * x - b * y) / c;           }           if ((a * x < minn) && (maxn + minn - 2 * a * x < ans[0])) {             ans[0] = maxn + minn - 2 * a * x;             ans[1] = x;             ans[2] = y;             ans[3] = (s - a * x - b * y) / c;           }         }       }     if (ans[1] || ans[2] || ans[3])       printf( %d %d %d , ans[1], ans[2], ans[3]);     else       printf( -1 );   }   