#include <bits/stdc++.h>
#define ssize(x) int(x.size())
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define V vector
using namespace std;
typedef long long ll;
int mod = 119<<23|1;
ll infll = 2e18;
// int add(int a, int b) { return a+b >= mod ? a+b-mod : a+b; }
// int sub(int a, int b) { return add(mod-b, a); }
// int mul(int a, int b) { return int(a*ll(b)%mod); }
// int fpow(int a, int b = mod-2) {
// int res = 1;
// while(b) {
// if (b & 1) res = mul(res, a);
// b >>= 1, a = mul(a, a);
// }
// return res;
// }
// int divd(int a, int b) {
// assert(b != 0);
// return mul(a, fpow(b));
// }
template<typename... Args>
void read(Args&... args) {
auto read_one = [&](auto &a) {
a = 0; int c = getchar_unlocked();
while (c < '0' || '9' < c) c = getchar_unlocked();
while ('0' <= c && c <= '9') a = a*10+c-'0', c = getchar_unlocked();
};
return (read_one(args), ...);
}
void answer() {
int n; scanf("%d", &n);
V<int> t(n+1, 0);
ll sum = 0;
for (int i = 1; i <= n; ++i) scanf("%d", &t[i]), sum += t[i];
V<int> divs;
for (int i = 1; i <= n; ++i)
if (sum % i == 0) divs.emplace_back(i);
int result = 0;
V<int> add(n+1, 0);
for (int k : divs) {
fill(all(add), 0);
bool good = 1; sum = 0;
for (int i = 1; i <= n; ++i) {
if (i > k) sum -= add[i-k];
if (n-i+1 < k) {
if (t[i]-sum != 0) good = 0;
continue;
}
if (t[i]-sum < 0) good = 0;
add[i] = t[i]-int(sum), sum += add[i];
}
if (good) result = k;
}
printf("%d\n", result);
}
int main() {
int T = 1; //scanf("%d", &T);
for (++T; --T; ) answer();
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 | #include <bits/stdc++.h> #define ssize(x) int(x.size()) #define all(x) x.begin(),x.end() #define rall(x) x.rbegin(),x.rend() #define V vector using namespace std; typedef long long ll; int mod = 119<<23|1; ll infll = 2e18; // int add(int a, int b) { return a+b >= mod ? a+b-mod : a+b; } // int sub(int a, int b) { return add(mod-b, a); } // int mul(int a, int b) { return int(a*ll(b)%mod); } // int fpow(int a, int b = mod-2) { // int res = 1; // while(b) { // if (b & 1) res = mul(res, a); // b >>= 1, a = mul(a, a); // } // return res; // } // int divd(int a, int b) { // assert(b != 0); // return mul(a, fpow(b)); // } template<typename... Args> void read(Args&... args) { auto read_one = [&](auto &a) { a = 0; int c = getchar_unlocked(); while (c < '0' || '9' < c) c = getchar_unlocked(); while ('0' <= c && c <= '9') a = a*10+c-'0', c = getchar_unlocked(); }; return (read_one(args), ...); } void answer() { int n; scanf("%d", &n); V<int> t(n+1, 0); ll sum = 0; for (int i = 1; i <= n; ++i) scanf("%d", &t[i]), sum += t[i]; V<int> divs; for (int i = 1; i <= n; ++i) if (sum % i == 0) divs.emplace_back(i); int result = 0; V<int> add(n+1, 0); for (int k : divs) { fill(all(add), 0); bool good = 1; sum = 0; for (int i = 1; i <= n; ++i) { if (i > k) sum -= add[i-k]; if (n-i+1 < k) { if (t[i]-sum != 0) good = 0; continue; } if (t[i]-sum < 0) good = 0; add[i] = t[i]-int(sum), sum += add[i]; } if (good) result = k; } printf("%d\n", result); } int main() { int T = 1; //scanf("%d", &T); for (++T; --T; ) answer(); return 0; } |
English