#include<bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for (int i = (a); i < (b); i++)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define ST first
#define ND second
#define PB push_back
using ll = long long;
using ld = long double;
using pi = pair<int,int>;
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;
#ifdef LOCAL
#define DTP(x, y) \
auto operator<<(auto &o, auto a)->decltype(y, o) \
{ \
o << "("; \
x; \
return o << ")"; \
}
DTP(o << a.first << ", " << a.second, a.second);
DTP(for (auto i : a) o << i << ", ", all(a));
void dump(auto... x) { ((cerr << x << ", "), ...) << '\n'; }
#define debug(x...) cerr << setw(4) << __LINE__ << ":[" #x "]: ", dump(x)
#else
#define debug(...) 0
#endif
int n;
vi A;
vi W;
bool Works(int k){
vi B(n+1);
int curr=0;
rep(i, 0, n){
curr-=B[i];
if(curr>A[i])
return false;
if(curr<A[i]){
if(i+k<=n){
B[i+k]+=A[i]-curr;
curr=A[i];
}else
return false;
}
}
return true;
}
void Solve()
{
cin >> n;
A.resize(n);
W.resize(n+1);
W[1]=1;
rep(i, 0, n)
cin >> A[i];
ll sum=0;
rep(i, 0, n)
sum+=(ll)(A[i]);
vi Divs;
ll sc=sum;
for(ll i=2; i*i<=sc; ++i){
if(sc%i==0)
Divs.PB(i);
while(sc%i==0)
sc/=i;
}
if(sc>1)
Divs.PB(sc);
int best=1;
rep(i, 2, n+1){
if(sum%i)
continue;
for(ll a: Divs)
if(i%a==0 && !W[a])
continue;
W[i]=Works(i);
if(W[i])
best=i;
}
cout << best;
return;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int t=1;
// cin >> t;
while(t--)
{
Solve();
}
return 0;
}
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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | #include<bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i = (a); i < (b); i++) #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() #define ST first #define ND second #define PB push_back using ll = long long; using ld = long double; using pi = pair<int,int>; using vi = vector<int>; using vvi = vector<vi>; using vll = vector<ll>; #ifdef LOCAL #define DTP(x, y) \ auto operator<<(auto &o, auto a)->decltype(y, o) \ { \ o << "("; \ x; \ return o << ")"; \ } DTP(o << a.first << ", " << a.second, a.second); DTP(for (auto i : a) o << i << ", ", all(a)); void dump(auto... x) { ((cerr << x << ", "), ...) << '\n'; } #define debug(x...) cerr << setw(4) << __LINE__ << ":[" #x "]: ", dump(x) #else #define debug(...) 0 #endif int n; vi A; vi W; bool Works(int k){ vi B(n+1); int curr=0; rep(i, 0, n){ curr-=B[i]; if(curr>A[i]) return false; if(curr<A[i]){ if(i+k<=n){ B[i+k]+=A[i]-curr; curr=A[i]; }else return false; } } return true; } void Solve() { cin >> n; A.resize(n); W.resize(n+1); W[1]=1; rep(i, 0, n) cin >> A[i]; ll sum=0; rep(i, 0, n) sum+=(ll)(A[i]); vi Divs; ll sc=sum; for(ll i=2; i*i<=sc; ++i){ if(sc%i==0) Divs.PB(i); while(sc%i==0) sc/=i; } if(sc>1) Divs.PB(sc); int best=1; rep(i, 2, n+1){ if(sum%i) continue; for(ll a: Divs) if(i%a==0 && !W[a]) continue; W[i]=Works(i); if(W[i]) best=i; } cout << best; return; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int t=1; // cin >> t; while(t--) { Solve(); } return 0; } |
English