#include <iostream>
#include <fstream>
#define N 100005
using namespace std;
ifstream f("grupuri.in");
ofstream g("grupuri.out");
int v[N],poz[N],heap[N],n,k,l,mn,inf=-(1<<30),rez,ch,maxime[N];
string s;
int nextint()
{
int num=0;
while(s[ch]==' ') ++ch;
while(s[ch]<='9' && s[ch]>='0')
{
num=num*10+s[ch]-'0';
++ch;
}
return num;
}
void down(int x)
{
bool ok=true;
while(ok)
{
ok=false;
mn=inf;
if(x*2<=l && mn<v[heap[x*2]]) mn=v[heap[x*2]], ch=x*2;
if(x*2+1<=l && mn<v[heap[x*2+1]]) mn=v[heap[x*2+1]], ch=x*2+1;
if(v[heap[x]]<mn)
{
swap(poz[heap[x]],poz[heap[ch]]);
swap(heap[x],heap[ch]);
ok=true;
x=ch;
}
}
}
void up(int x)
{
while(v[heap[x]]>v[heap[x/2]])
{
swap(poz[heap[x]],poz[heap[x/2]]);
swap(heap[x],heap[x/2]);
x/=2;
}
}
int main()
{
f>>k>>n; getline(f,s); getline(f,s); l=n;
for(int i=1;i<=n;++i)
{
v[i]=nextint();
heap[i]=n-i+1;
poz[i]=n-i+1;
}
while(l>=k)
{
for(int i=1;i<=k;++i) ///scoate maximele
{
maxime[i]=heap[1]; v[heap[1]]--;
heap[1]=heap[l]; poz[heap[1]]=1; --l;
down(1);
}
for(int i=1;i<=k;++i)
{
if(v[maxime[i]])
{
up(++l);
}
}
++rez;
}
g<<rez;
return 0;
}