#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ff first
#define ss second
vector <ll> divv;
vector <pair <ll, ll> > fac;
void finddiv(int i, ll val) {
if (i == (int)fac.size()) {
divv.emplace_back(val);
return;
}
ll temp = 1;
for (int j = 0; j <= fac[i].ss; j++) {
finddiv(i+1, val*temp);
temp *= fac[i].ff;
}
}
int n;
vector <ll> v;
bool check(ll a) {
ll cur = 0;
vector <ll> kon(n+1);
for (int i = 0; i < n; i++) {
cur -= kon[i];
ll nowe = v[i] - cur;
if (nowe < 0)
return false;
if (nowe > 0) {
if (i + a > n) {
return false;
}
cur += nowe;
kon[i + a] += nowe;
}
}
return true;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
ll sum = 0;
v.resize(n);
for (int i = 0; i < n; i++) {
cin >> v[i];
sum += v[i];
}
ll temp = sum;
for (ll p = 2; p*p <= temp; p++) {
int cnt = 0;
while (temp % p == 0) {
temp /= p;
cnt++;
}
fac.emplace_back(p, cnt);
}
if (temp > 1) {
fac.emplace_back(temp, 1);
}
finddiv(0, 1);
sort(divv.rbegin(), divv.rend());
for (int i = 0; i < (int)divv.size(); i++) {
if (divv[i] <= n) {
if (check(divv[i])) {
cout << divv[i] << "\n";
return 0;
}
}
}
cout << 1 << "\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 | #include <bits/stdc++.h> using namespace std; #define ll long long #define ff first #define ss second vector <ll> divv; vector <pair <ll, ll> > fac; void finddiv(int i, ll val) { if (i == (int)fac.size()) { divv.emplace_back(val); return; } ll temp = 1; for (int j = 0; j <= fac[i].ss; j++) { finddiv(i+1, val*temp); temp *= fac[i].ff; } } int n; vector <ll> v; bool check(ll a) { ll cur = 0; vector <ll> kon(n+1); for (int i = 0; i < n; i++) { cur -= kon[i]; ll nowe = v[i] - cur; if (nowe < 0) return false; if (nowe > 0) { if (i + a > n) { return false; } cur += nowe; kon[i + a] += nowe; } } return true; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n; ll sum = 0; v.resize(n); for (int i = 0; i < n; i++) { cin >> v[i]; sum += v[i]; } ll temp = sum; for (ll p = 2; p*p <= temp; p++) { int cnt = 0; while (temp % p == 0) { temp /= p; cnt++; } fac.emplace_back(p, cnt); } if (temp > 1) { fac.emplace_back(temp, 1); } finddiv(0, 1); sort(divv.rbegin(), divv.rend()); for (int i = 0; i < (int)divv.size(); i++) { if (divv[i] <= n) { if (check(divv[i])) { cout << divv[i] << "\n"; return 0; } } } cout << 1 << "\n"; return 0; } |
English