#include <bits/stdc++.h>
using namespace std;
using ll = long long;
vector <ll> a, dziel;
void na_dzielniki(ll n){
ll i;
for (i=1; i<sqrt(n); ++i){
if (n%i == 0){
dziel.push_back(i);
dziel.push_back(n/i);
}
}
sort(dziel.begin(), dziel.end());
}
bool ok(ll n, ll k){
ll suma=0, x, i;
vector <ll> b(n, 0);
for (i=0; i<n; ++i){
if (a[i]-suma > 0){
if (i <= n-k){
x = a[i]-suma;
b[i+k-1] += x;
suma += x;
}
else{
return false;
}
}
if (a[i]-suma < 0)
return false;
suma -= b[i];
}
if (suma > 0)
return false;
return true;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
ll n, m, k=0, maxi=1, i, j;
cin >> n;
a.resize(n);
for (i=0; i<n; ++i){
cin >> a[i];
k += a[i];
}
na_dzielniki(k);
m = dziel.size();
priority_queue <ll> zle;
for (i=0; i<m; ++i){
if (!zle.empty() && -zle.top() == dziel[i]){
zle.pop();
continue;
}
if (ok(n, dziel[i])){
maxi = max(maxi, dziel[i]);
}
else{
for (j=2*dziel[i]; j<n; j+=dziel[i])
zle.push(-j);
}
}
cout << maxi << '\n';
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 | #include <bits/stdc++.h> using namespace std; using ll = long long; vector <ll> a, dziel; void na_dzielniki(ll n){ ll i; for (i=1; i<sqrt(n); ++i){ if (n%i == 0){ dziel.push_back(i); dziel.push_back(n/i); } } sort(dziel.begin(), dziel.end()); } bool ok(ll n, ll k){ ll suma=0, x, i; vector <ll> b(n, 0); for (i=0; i<n; ++i){ if (a[i]-suma > 0){ if (i <= n-k){ x = a[i]-suma; b[i+k-1] += x; suma += x; } else{ return false; } } if (a[i]-suma < 0) return false; suma -= b[i]; } if (suma > 0) return false; return true; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll n, m, k=0, maxi=1, i, j; cin >> n; a.resize(n); for (i=0; i<n; ++i){ cin >> a[i]; k += a[i]; } na_dzielniki(k); m = dziel.size(); priority_queue <ll> zle; for (i=0; i<m; ++i){ if (!zle.empty() && -zle.top() == dziel[i]){ zle.pop(); continue; } if (ok(n, dziel[i])){ maxi = max(maxi, dziel[i]); } else{ for (j=2*dziel[i]; j<n; j+=dziel[i]) zle.push(-j); } } cout << maxi << '\n'; return 0; } |
English