/*
* Problem :: 2792 / 보석 상자
*
* Kind :: Binary Search
*
* Insight
* - 음...
* 처음부터 질투심을 정해놓고 배분하면 되려나?
* 보석을 받지 못하는 학생이 있어도 되니까
* + 질투심 10 으로 나누어주었을 때
* 가능하면 질투심 9 로도 해보고...
* 이분탐색..?
* # 질투심 증가 / 받는 학생수 감소
* 질투심 감소 / 받는 학생수 증가
* 단조함수 => 이분탐색으로 풀면 되겠다!
*
* Point
* - l, r 잡을 때 Overflow 조심심
* 받는 학생수 계산할 때도 Overflow 조심
* + long 으로 선언해주자
*/
//
// BOJ
// ver.C++
//
// Created by GGlifer
//
// Open Source
#include <iostream>
#include <algorithm>
using namespace std;
#define endl '\n'
// Set up : Global Variables
/* None */
// Set up : Functions Declaration
/* None */
int main()
{
// Set up : I/O
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Set up : Input
int N, M;
cin >> N >> M;
int K[M];
for (int i=0; i<M; i++)
cin >> K[i];
// Process
int ans = -1;
/* 최소 질투심 = m1
* 최대 질투심 = max(K번 색상 보석의 개수) */
long l = 1, r = *max_element(K, K+M);
while (l <= r) {
long m = (l+r)/2; /* 현재 질투심 */
long cnt = 0; /* 받는 학생수 */
for (int k : K) {
cnt += (k+m-1)/m;
}
/* 현재 질투심으로 나누어 줄 수 있다면 */
if (cnt <= N) {
ans = m;
r = m-1;
/* 현재 질투심으로 나누어 줄 수 없다면 */
} else {
l = m+1;
}
}
// Control : Output
cout << ans << endl;
}
// Helper Functions
/* None */