#include #include #include #include #define X first #define Y second #define PB push_back #define all(x) (x).begin(), (x).end() using namespace std; typedef long long ll; typedef unsigned long long ull; typedef __int128 lll; const int N = 2e5 + 500; ull modmul(ull a, ull b, ull M) { ll ret = a * b - M * ull(1.L / M * a * b); return ret + M * (ret < 0) - M * (ret >= (ll)M); } ull modpow(ull b, ull e, ull mod) { ull ans = 1; for(; e; b = modmul(b, b, mod), e /= 2) if(e & 1) ans = modmul(ans, b, mod); return ans; } bool isPrime(ull n) { if(n < 2 || n % 6 % 4 != 1) return (n | 1) == 3; ull A[] = {2, 325, 9375, 28178, 450775, 9780504, 1795265022}, s = __builtin_ctzll(n - 1), d = n >> s; for (ull a : A) { ull p = modpow(a % n, d, n), i = s; while (p != 1 && p != n - 1 && a % n && i--) p = modmul(p, p, n); if (p != n - 1 && i != s) return 0; } return 1; } ull pollard(ull n) { auto f = [n](ull x) { return modmul(x, x, n) + 1; }; ull x = 0, y = 0, t = 30, prd = 2, i = 1, q; while(t++ % 40 || __gcd(prd, n) == 1) { if(x == y) x = ++i, y = f(x); if ((q = modmul(prd, max(x, y) - min(x, y), n))) prd = q; x = f(x), y = f(f(y)); } return __gcd(prd, n); } vector factor(ull n) { if (n == 1) return {}; if(isPrime(n)) return {n}; ull x = pollard(n); auto l = factor(x), r = factor(n / x); l.insert(l.end(), all(r)); return l; } int n, k, cnt[N], zad; ll h[N], sm_h = 0, faks[30], faks_cnt[30]; map < ll, int > puta; pair < ll, ll > eval(int x, int y) { ll br = 0, naz = y; for(int i = 0;i < n;i++) br += (h[i] + x - 1) / x; return {br, naz}; } int multi; void gen(int i, int kol) { if(i == zad) { cnt[kol] += multi; return; } for(int j = 0;j <= faks_cnt[i];j++) { if((ll)kol * faks[i] > k) break; kol *= faks[i]; gen(i + 1, kol); } } int main() { scanf("%d%d", &n, &k); for(int i = 0;i < n;i++) { scanf("%lld", h + i); sm_h += h[i]; } sort(h, h + n); pair < ll, ll > bar = eval(k / 2, (k + 1) / 2); vector < int > mozd; for(int j = 1;j < k;j++) { if((lll)bar.X * j * (k - j) > (lll)sm_h * bar.Y) { mozd.PB(j); } } if(1 || (ll)mozd.size() * n < (ll)2e8) { int ans = k / 2; for(int x : mozd) { pair < ll, ll > novi = eval(x, k - x); if(novi.X * bar.Y < novi.Y * bar.X) { bar = novi; ans = x; } } printf("%d %d\n", ans, k - ans); return 0; } /** for(int i = 0;i < n;i++) { if(i + 1 < n && h[i + 1] == h[i]) continue; vector < ll > svi = factor(h[i]); sort(svi.begin(), svi.end()); if(svi[0] > k) break; faks[0] = svi[0]; faks_cnt[0] = 1; int j = 0; for(int i = 1;i < (int)svi.size();i++) { if(svi[i] > k) break; if(svi[i] != faks[j]) { faks[++j] = svi[i]; faks[j] = 0; } faks[j]++; } zad = j + 1; multi = puta[h[i]]; gen(0, 1); } for(int j = 1;j <= k;j++) { } **/ return 0; }