#include<stdio.h>
int n;
int k;
long long int l = 0;   //左界为0;
long long int r = 1e9; //右界为1e9;
long long int p[500000];
long long int pa(long long int x) {
    long long int len = 0;
    if (x == 0) return k;   //当mid为0时返回k;
    for (int i = 1; i <= n; i++) {
        len += p[i] / x;
    }
    return len;
}
int main() {
    scanf("%d%d", &n, &k);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &p[i]);
    }
    long long int mid;
    mid = (l + r) / 2;
    while (l <= r) { 
        int cnt = pa(mid);
        if (mid == 1 && cnt < k) { //当mid==1&&cnt<k说明没有满足这个的k,没有答案;
            printf("0");
            return 0;
        }
        else if (cnt < k) {      //当cnt<k时说明mid过大;让边界r=mid-1,变小一点;
            r = mid - 1;
        }
        else if (cnt >= k && mid != 0) {     //这样保证了cnt>k的来源是存在解的;
            l = mid + 1;
        }  
        else  {   //mid=0,是一定是一个解,但也要判断1是不是解 如0 1 mid=0;
            l = mid + 1;
        }
        mid = (l + r) / 2;//这个位置很重要:先判断前一个mid满足让l=mid+1,后一个mid
    }                     //不满足让r=mid-1,这样可以保证这个mid是对的,并且这个mid
        printf("%lld", mid);    //使得第三个mid与第一个mid相等,并将其为答案;
    return 0;
}
/*-说明:只要cnt>k出现了l一定变大,这样其实一定能找到莫个cnt是的成立
cnt=k有两种情况1.当mid=0,因为0肯定满足,所以可以让l=mid+1,找还有没有这样的值
如果有就找到 2.存在cnt=k,就可以向前找知道l>r就可以找出最大值满足这个条件*/