#include <iostream>
#include <vector>
using namespace std;
bool isValid(int k, vector<int> &v) {
if (k > v.size()) return false;
vector<int> counter(v.size());
counter[0] = v[0];
int toSub = counter[0];
if (k == 1) toSub = 0;
for (int i = 1; i <= v.size() - k; ++i) {
int vl = v[i] - toSub;
if (vl < 0) return false;
counter[i] = vl;
toSub += counter[i];
if (i + 1 >= k) toSub -= counter[i - k + 1];
}
for (int i = v.size() - k + 1; i < v.size(); ++i) {
int vl = v[i] - toSub;
if (vl != 0) return false;
if (i + 1 >= k) toSub -= counter[i - k + 1];
}
return true;
}
int main() {
int n;
scanf("%d", &n);
long long sum = 0;
vector<int> v(n);
for (int i = 0; i < n; ++i) {
scanf("%d", &v[i]);
sum += v[i];
}
vector<vector<int>> t;
int l = 0; int r;
while(v[l] == 0) ++l;
r = l;
while (r < n) {
while (r + 1 < n && v[r + 1] > 0) ++r;
if (r == n) break;
t.push_back(vector<int>());
while (l <= r) {
t.back().push_back(v[l]);
++l;
}
while(l < n && v[l] == 0) ++l;
r = l;
}
vector<int> toCheck;
for (int i = 1; i <= n; ++i) {
if (sum % i == 0) {
toCheck.push_back(i);
}
}
for (int i = toCheck.size() - 1; i >= 0; --i) {
bool yes = true;
for (int j = 0; j < t.size(); ++j) {
if (!isValid(toCheck[i], t[j])) {
yes = false;
break;
}
}
if(yes) {
printf("%d\n", toCheck[i]);
return 0;
}
}
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 | #include <iostream> #include <vector> using namespace std; bool isValid(int k, vector<int> &v) { if (k > v.size()) return false; vector<int> counter(v.size()); counter[0] = v[0]; int toSub = counter[0]; if (k == 1) toSub = 0; for (int i = 1; i <= v.size() - k; ++i) { int vl = v[i] - toSub; if (vl < 0) return false; counter[i] = vl; toSub += counter[i]; if (i + 1 >= k) toSub -= counter[i - k + 1]; } for (int i = v.size() - k + 1; i < v.size(); ++i) { int vl = v[i] - toSub; if (vl != 0) return false; if (i + 1 >= k) toSub -= counter[i - k + 1]; } return true; } int main() { int n; scanf("%d", &n); long long sum = 0; vector<int> v(n); for (int i = 0; i < n; ++i) { scanf("%d", &v[i]); sum += v[i]; } vector<vector<int>> t; int l = 0; int r; while(v[l] == 0) ++l; r = l; while (r < n) { while (r + 1 < n && v[r + 1] > 0) ++r; if (r == n) break; t.push_back(vector<int>()); while (l <= r) { t.back().push_back(v[l]); ++l; } while(l < n && v[l] == 0) ++l; r = l; } vector<int> toCheck; for (int i = 1; i <= n; ++i) { if (sum % i == 0) { toCheck.push_back(i); } } for (int i = toCheck.size() - 1; i >= 0; --i) { bool yes = true; for (int j = 0; j < t.size(); ++j) { if (!isValid(toCheck[i], t[j])) { yes = false; break; } } if(yes) { printf("%d\n", toCheck[i]); return 0; } } return 0; } |
English