// Zadanie Bursztyny
// Potyczki algorytmiczne 2026
#include <iostream>
using namespace std;
unsigned int next_lesser_divisor(unsigned long int p, unsigned int q)
// Następny mniejszy dzielnik, 0 gdy nie ma.
{
if (q == 1)
return 0;
for (unsigned int q1 = q - 1; q1 >= 1; q1--)
if (p % q1 == 0)
return q1;
}
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
unsigned int n, k;
unsigned long int s = 0;
cin >> n;
int *a = new int[n];
for (unsigned int i = 0 ; i < n; i++)
{
cin >> a[i];
s += a[i];
}
// Sprawdź, jakie najdłuższe kl i kr mogły przypłynąć z lewej i z prawej strony.
unsigned int kl = 1, kr = 1;
for (unsigned int i = n - 2; i >= 0 ;i--)
{
if (a[i] >= a[i + 1])
kr++;
else
break;
}
for (unsigned int i = 1; i < n ; i++)
{
if (a[i - 1] <= a[i])
kl++;
else
break;
}
k = min(kl, kr);
if (k != 1)
{
if (s % k != 0)
k = next_lesser_divisor(s, k);
// Symulacja dla bieżącego k.
int *d = new int[n]; // Liczba fal o początku w danym segmencie.
while (k > 1)
{
bool ok = true;
d[0] = a[0];
for (unsigned int i = 1; i < k; i++)
d[i] = a[i] - a[i - 1]; // Tutaj a niemaleje.
for (unsigned int i = k; i < n; i++)
{
d[i] = a[i] - (a[i - 1] - d[i - k]); // Te zaczęte k segmentów wstecz się skończyły.
if (d[i] < 0 || (d[i] > 0 && i > n - k))
{
// Kamyk trzeba cofnąć lub nowa fala się zaczyna za bardzo w prawo.
ok = false;
k = next_lesser_divisor(s, k);
break;
}
}
if (ok)
break;
}
delete [] d;
}
delete [] a;
cout << k << endl;
// system("pause");
}
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 82 83 | // Zadanie Bursztyny // Potyczki algorytmiczne 2026 #include <iostream> using namespace std; unsigned int next_lesser_divisor(unsigned long int p, unsigned int q) // Następny mniejszy dzielnik, 0 gdy nie ma. { if (q == 1) return 0; for (unsigned int q1 = q - 1; q1 >= 1; q1--) if (p % q1 == 0) return q1; } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); unsigned int n, k; unsigned long int s = 0; cin >> n; int *a = new int[n]; for (unsigned int i = 0 ; i < n; i++) { cin >> a[i]; s += a[i]; } // Sprawdź, jakie najdłuższe kl i kr mogły przypłynąć z lewej i z prawej strony. unsigned int kl = 1, kr = 1; for (unsigned int i = n - 2; i >= 0 ;i--) { if (a[i] >= a[i + 1]) kr++; else break; } for (unsigned int i = 1; i < n ; i++) { if (a[i - 1] <= a[i]) kl++; else break; } k = min(kl, kr); if (k != 1) { if (s % k != 0) k = next_lesser_divisor(s, k); // Symulacja dla bieżącego k. int *d = new int[n]; // Liczba fal o początku w danym segmencie. while (k > 1) { bool ok = true; d[0] = a[0]; for (unsigned int i = 1; i < k; i++) d[i] = a[i] - a[i - 1]; // Tutaj a niemaleje. for (unsigned int i = k; i < n; i++) { d[i] = a[i] - (a[i - 1] - d[i - k]); // Te zaczęte k segmentów wstecz się skończyły. if (d[i] < 0 || (d[i] > 0 && i > n - k)) { // Kamyk trzeba cofnąć lub nowa fala się zaczyna za bardzo w prawo. ok = false; k = next_lesser_divisor(s, k); break; } } if (ok) break; } delete [] d; } delete [] a; cout << k << endl; // system("pause"); } |
English