#include <cstdio>
#include <vector>
typedef long long LL;
using namespace std;
int n;
vector<int> a;
bool test(int k) {
LL sum = 0;
vector<int> t(k, 0);
int j = k-1;
for (int i=0; i<n; ++i) {
if (++j >= k) j -= k;
sum -= t[j];
if (sum > a[i]) return false;
t[j] = a[i]-sum;
sum += t[j];
}
sum -= t[n%k];
return sum == 0;
}
vector< pair<LL, int> > fact;
LL rec(int k, LL v) {
if (v > n) return 0;
if (k >= fact.size()) {
return test(v) ? v : 0;
}
LL res = 0;
for (int i=0; i<=fact[k].second; ++i) {
LL tmp = rec(k+1, v);
if (tmp == 0) break;
res = max(res, tmp);
v *= fact[k].first;
}
return res;
}
int main() {
scanf("%d", &n);
a.resize(n);
LL sum = 0;
for (int i=0; i<n; ++i) {
scanf("%d", &a[i]);
sum += a[i];
}
for (LL i = 2; i*i <= sum; ++i) {
while (sum % i == 0) {
if (fact.empty() || fact.back().first != i) {
fact.emplace_back(i, 1);
} else {
fact.back().second++;
}
sum /= i;
}
}
if (sum > 1) fact.emplace_back(sum, 1);
printf("%lld", rec(0, 1));
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 | #include <cstdio> #include <vector> typedef long long LL; using namespace std; int n; vector<int> a; bool test(int k) { LL sum = 0; vector<int> t(k, 0); int j = k-1; for (int i=0; i<n; ++i) { if (++j >= k) j -= k; sum -= t[j]; if (sum > a[i]) return false; t[j] = a[i]-sum; sum += t[j]; } sum -= t[n%k]; return sum == 0; } vector< pair<LL, int> > fact; LL rec(int k, LL v) { if (v > n) return 0; if (k >= fact.size()) { return test(v) ? v : 0; } LL res = 0; for (int i=0; i<=fact[k].second; ++i) { LL tmp = rec(k+1, v); if (tmp == 0) break; res = max(res, tmp); v *= fact[k].first; } return res; } int main() { scanf("%d", &n); a.resize(n); LL sum = 0; for (int i=0; i<n; ++i) { scanf("%d", &a[i]); sum += a[i]; } for (LL i = 2; i*i <= sum; ++i) { while (sum % i == 0) { if (fact.empty() || fact.back().first != i) { fact.emplace_back(i, 1); } else { fact.back().second++; } sum /= i; } } if (sum > 1) fact.emplace_back(sum, 1); printf("%lld", rec(0, 1)); return 0; } |
English