#include <cstdio>
#include <iostream>
#include <cstring>
#include <cassert>
using namespace std;
#define MAXN 50010
#define REP(i, n) for(int i=0; i<int(n); i++)
int x[MAXN], f[MAXN], s[MAXN], g[MAXN], lm[MAXN];
int w, n;
const int INF = 0x3f3f3f3f;
inline int calc(int l, int r){
    if(r - l <= 1)return INF;
    if(w - (s[r] - s[l]) >= r - l -1)
        return (w - (s[r] - s[l]) - 1) / (r - l - 1) + 1;
    return 0;
}
int main()
{
    while(scanf("%d%d", &w, &n)==2 && w != 0){
        s[0] = 0;
        REP(i, n){
            scanf("%d", x + i + 1);
            s[i+1] = s[i] + x[i+1];
        }
        int maxi = n;
        while(maxi > 0 && calc(maxi - 1, n) > 0)maxi--;
        for(int i = 2, t = 0; i <= n; i++){
            while(calc(t, i) <= 0) t++;
            lm[i] = t;
        }
        int l = 1, h = w;
        for(; l + 1 < h;){
            int maxoki = 0, mid = (l + h - 1) / 2;
            f[0] = 0; f[2] = f[1] = 1;
            for(int i = 2, l = 0, r = 0; i <= n; i++){
                l = lm[i];
                while(calc(r, i) <= mid) r++;
                if(l < r && (f[r] - f[l] > 0)){
                    f[i + 1] = f[i] + 1;
                    maxoki = i;
                } else f[i + 1] = f[i];
            }
            if(maxoki >= maxi) h = mid + 1; else l = mid + 1;
        }
        printf("%d\n", l);
    }
}
