1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <bits/stdc++.h>
#define int long long 

using namespace std;
const int MX = 2e5+9;
int tab[MX], delta[MX];
vector<pair<int, int>>seg;
unordered_map<int, int>umap;
signed main(){
    cin.tie(0)->sync_with_stdio(0);
    int n; cin >> n;
    int l = 0;
    for(auto i = 1; i <= n; ++i){
        int x; cin >> x;
        tab[i] = x;
        if(x && !l) l = i;
        if(!x && l){
            seg.emplace_back(l, i);
            l = 0;
        } 
    }
    if(l) seg.emplace_back(l, n+1);
    for(auto [l, r] : seg){
        int len = r-l+1, sum = 0;
        set<int>fac;
        for(auto i = l; i <= r; ++i) sum += tab[i];
        for(auto i = 1; (i*i <= sum && i <= len); ++i){
            if(sum%i) continue;
            int j = sum/i;
            fac.insert(i);
            if(j <= len) fac.insert(j);
        }
        for(auto k : fac){
            // cout << k << endl;
            bool b = 1;
            int cur = 0;
            for(auto i = l; i < r; ++i){
                cur -= delta[i];
                int need = tab[i]-cur;
                if(need < 0){
                    b = 0;
                    break;
                }
                if(need > 0 && i+k > r){
                    b = 0;
                    break;
                }
                delta[i+k] = need;
                cur = tab[i];
            }
            for(auto i = l; i <= r; ++i){
                delta[i] = 0;
            }
            umap[k] += b;
        }
    }
    int res = 0;
    for(auto [i, val] : umap){
        if(val == seg.size()) res = max(res, i);
        // cout << i << " " << val << " " << seg.size() << endl;
    }
    cout << res;
}