//#pragma GCC target("avx2") #include using namespace std; using ll=long long; #define int ll #define rep(i,a,b) for(int i=a;i<(b);i++) #define sz(x) (int)(x).size() #define all(x) begin(x), end(x) using pii=pair; using vi=vector; #define fi first #define se second #define pb push_back const int N=2e5+100; ll h[N]; int n; int k; double calc(int n,int x,int y) { ll sum=0; for(int i=1;i<=n;i++) sum+=(h[i]+x-1)/x; return double(sum)/y; } set st; double ans(int x) { if (st.count(x)) return 1e18; if (x <= 0 || x >= k) return 1e18; st.insert(x); int s = 0; for (int i=1; i<=n; i++) s += (h[i] + x - 1) / x; return s*1.0/(k-x); } pair mn = {1e18, -1}; double don(int x) { double r = ans(x); mn = min(mn, {ans(x), x}); return r; } signed main() { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); cin>>n>>k; for(int i=1;i<=n;i++) cin>>h[i]; sort(h+1, h+n+1); vector v; for (int i=1; i<=n; i++) if (i==1 || h[i] != h[i-1]) v.pb(h[i]); mt19937_64 mt(time(0)); int l = 1; int r = k-1; while (r-l > 10) { int m1 = (2*l+r)/3; int m2 = (l+2*r)/3; if (don(m1) < don(m2)) r = m1; else l = m2; } for (int i=l-10; i<=r+10; i++) don(i); int C = 10; for (int i=1; i 10) { int m1 = (2*l+r)/3; int m2 = (l+2*r)/3; if (don(m1) < don(m2)) r = m1; else l = m2; } for (int i=l-10; i<=r+10; i++) don(i); } cerr< 3.8) break; } cerr< "<