#include <algorithm>
#include <cstdint>
#include <vector>
#include <iostream>
using namespace std;
bool check(vector<int>& a, int k) {
int n = a.size();
vector<int> cur(n);
for (int i = 0; i < n; i++) {
if (i > 0) cur[i] += cur[i - 1];
if (i + k - 1 < n) {
int d = a[i] - cur[i];
if (d < 0) return false;
cur[i] += d;
if (i + k < n) cur[i + k] -= d;
}
}
for (int i = 0; i < n; i++) {
if (cur[i] != a[i]) return false;
}
return true;
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
int n; cin >> n;
vector<int> a(n);
int64_t sum = 0;
for (int i = 0; i < n; i++) {
cin >> a[i];
sum += a[i];
}
int res = 1;
for (int64_t i = 1; i * i <= sum; i++) {
if (i <= n && sum % i == 0 && check(a, i)) {
res = max(res, int(i));
}
if (sum / i <= n && sum % (sum / i) == 0 && check(a, sum / i)) {
res = max(res, int(sum / i));
}
}
cout << res << '\n';
return 0;
}
/*
4
1 0 1 2
8
1 2 3 4 5 5 3 1
*/
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 | #include <algorithm> #include <cstdint> #include <vector> #include <iostream> using namespace std; bool check(vector<int>& a, int k) { int n = a.size(); vector<int> cur(n); for (int i = 0; i < n; i++) { if (i > 0) cur[i] += cur[i - 1]; if (i + k - 1 < n) { int d = a[i] - cur[i]; if (d < 0) return false; cur[i] += d; if (i + k < n) cur[i + k] -= d; } } for (int i = 0; i < n; i++) { if (cur[i] != a[i]) return false; } return true; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; vector<int> a(n); int64_t sum = 0; for (int i = 0; i < n; i++) { cin >> a[i]; sum += a[i]; } int res = 1; for (int64_t i = 1; i * i <= sum; i++) { if (i <= n && sum % i == 0 && check(a, i)) { res = max(res, int(i)); } if (sum / i <= n && sum % (sum / i) == 0 && check(a, sum / i)) { res = max(res, int(sum / i)); } } cout << res << '\n'; return 0; } /* 4 1 0 1 2 8 1 2 3 4 5 5 3 1 */ |
English