#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
long long a[N];
long long n,k;//全局变量
long long check(long long mid){//检查mid对不对
long long cnt=0;
for(long long i=1;i<=n;i++)
cnt+=a[i]/mid;//把所有的树遍历,统计在mid下能切多少条
if(cnt==k)return 1;//如果刚好等于,说明符合
else if(cnt>k)return 2;//如果切的数量比目标多,返回第二种情况
else if(cnt<k)return 3;//少就返回第三种
}
int main(){
cin>>n>>k;
for(long long i=1;i<=n;i++)
cin>>a[i];
long long l=1,r=1e8+10,mid,ans=0;
while(l<=r){//二分切的长度
mid=(l+r)/2;
if(check(mid)==1){//如果符合题意
ans=mid;//先存一个保底答案
l=mid+1;//看看有没有更大的
}
else if(check(mid)==2)//如果返回2就说明mid长度太短了,切的树太多
l=mid+1;
else if(check(mid)==3)//mid太长,不够
r=mid-1;//弄短点
}
cout<<ans;
}