func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, s;   int c[3];   void init() {     int score;     scanf( %d%d , &n, &s);     for (int i = 0; i < n; i++) {       scanf( %d , &score);       c[score - 3]++;     }   }   int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }   void extended_gcd(int a, int b, int c, int &x, int &y) {     if (!b) {       x = c / a, y = 0;       return;     }     extended_gcd(b, a % b, c, y, x);     y -= (a / b) * x;   }   void solve() {     int k[3], ret = 0x7FFFFFFF;     int d = gcd(c[1], c[2]);     for (int i = 0; i <= s; i++) {       int A = c[1], B = c[2], C = s - i * c[0], x, y;       if (C < 0) break;       if (C % d != 0) continue;       extended_gcd(A, B, C, x, y);       int delta1 = B / d, delta2 = A / d;       if (y > x && delta2 != 0) {         int delta = (y - x) / delta2;         y -= delta2 * delta;         x += delta1 * delta;       }       for (int step = 17; step >= 0; step--) {         if (y >= x) break;         if (y + delta2 * (1 << step) <= x - delta1 * (1 << step)) {           y += delta2 * (1 << step);           x -= delta1 * (1 << step);         }       }       if (c[1] * x > c[2] * y) {         for (int step = 17; step >= 0; step--)           if (x - delta1 * (1 << step) >= i) {             if (c[1] * (x - delta1 * (1 << step)) >=                 c[2] * (y + delta2 * (1 << step))) {               x -= delta1 * (1 << step);               y += delta2 * (1 << step);             }           }       }       if (y < i && delta2 != 0) {         int delta = (i - y - 1) / delta2 + 1;         y += delta2 * delta;         x -= delta1 * delta;       }       for (int j = 0;; j++) {         if (x >= i && y >= x &&             abs(c[0] * i - c[1] * x) + abs(c[1] * x - c[2] * y) < ret) {           ret = abs(c[0] * i - c[1] * x) + abs(c[1] * x - c[2] * y);           k[0] = i, k[1] = x, k[2] = y;         }         if (y >= x && c[2] * y > c[1] * x) {           break;         }         y += delta2;         x -= delta1;         if (x < i) break;       }     }     if (ret == 0x7FFFFFFF) {       printf( %d n , -1);     } else       printf( %d %d %d n , k[0], k[1], k[2]);   }   int main() {     init();     solve();     return 0;   }   