#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
#define MAX_N 100006
#ifndef DEB_VAL
#define DEB_VAL 0
#endif
#define DEB if(debug)
#define MP make_pair
#define PB push_back
#define FT first
#define SD second
int debug = DEB_VAL;
int n;
int a[MAX_N];
int q[MAX_N];
long long qd[MAX_N];
int dz[MAX_N];
long long pref[MAX_N];
int suf[MAX_N];
int top,bot;
int ldz;
int main() {
scanf("%d",&n);
scanf("%d",a);
pref[0]=a[0];
for(int i=1;i<n;i++) {
scanf("%d", a+i);
pref[i]=pref[i-1]+a[i];
}
/*
DEB for(int i=0;i<n;i++) {
printf("%d ", pref[i]);
}
DEB printf("\n");
*/
ldz=0;
for(int i=n;i>1;i--) {
if(pref[n-1]%i==0) {
dz[ldz++]=i;
DEB printf("Dzielnik: %d\n",i);
}
}
debug=0;
int res=1;
bool ok=true;
for(int i=0;i<ldz;i++) {
res=dz[i];
DEB printf("Sprawdzam fale %d\n",res);
//spr czy fala res zadziała
long long ads=0;
ok=true;
top=bot=0;
for(int j=0;j<n;j++){
DEB printf("pole %d\n",j);
if(a[j]<ads) {
DEB printf("BAD\n");
ok=false;
break;
}
//nowe konce na kolejke
DEB printf("Wkladam konce: %d -> %lld\n",j+res-1,a[j]-ads);
if(a[j]-ads>0 && j+res-1>=n) {
ok=false;
break;
}
if(a[j]-ads>0) {
q[bot]=j+res-1;
qd[bot++]=a[j]-ads;
ads=a[j];
}
DEB printf("ads: %lld\n",ads);
DEB for(int zz=top;zz<bot;zz++) {
printf("(%d,%lld), ",q[zz],qd[zz]);
}
DEB printf("\n");
//zdejmujemy stare konce
while(top<bot && q[top]<=j){
ads-=qd[top];
top++;
}
DEB printf("Po zdjęciu konców: %lld\n",ads);
}
if(ok) break;
}
if(ok) printf("%d",res);
else printf("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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | #include<cstdio> #include<algorithm> #include<vector> using namespace std; #define MAX_N 100006 #ifndef DEB_VAL #define DEB_VAL 0 #endif #define DEB if(debug) #define MP make_pair #define PB push_back #define FT first #define SD second int debug = DEB_VAL; int n; int a[MAX_N]; int q[MAX_N]; long long qd[MAX_N]; int dz[MAX_N]; long long pref[MAX_N]; int suf[MAX_N]; int top,bot; int ldz; int main() { scanf("%d",&n); scanf("%d",a); pref[0]=a[0]; for(int i=1;i<n;i++) { scanf("%d", a+i); pref[i]=pref[i-1]+a[i]; } /* DEB for(int i=0;i<n;i++) { printf("%d ", pref[i]); } DEB printf("\n"); */ ldz=0; for(int i=n;i>1;i--) { if(pref[n-1]%i==0) { dz[ldz++]=i; DEB printf("Dzielnik: %d\n",i); } } debug=0; int res=1; bool ok=true; for(int i=0;i<ldz;i++) { res=dz[i]; DEB printf("Sprawdzam fale %d\n",res); //spr czy fala res zadziała long long ads=0; ok=true; top=bot=0; for(int j=0;j<n;j++){ DEB printf("pole %d\n",j); if(a[j]<ads) { DEB printf("BAD\n"); ok=false; break; } //nowe konce na kolejke DEB printf("Wkladam konce: %d -> %lld\n",j+res-1,a[j]-ads); if(a[j]-ads>0 && j+res-1>=n) { ok=false; break; } if(a[j]-ads>0) { q[bot]=j+res-1; qd[bot++]=a[j]-ads; ads=a[j]; } DEB printf("ads: %lld\n",ads); DEB for(int zz=top;zz<bot;zz++) { printf("(%d,%lld), ",q[zz],qd[zz]); } DEB printf("\n"); //zdejmujemy stare konce while(top<bot && q[top]<=j){ ads-=qd[top]; top++; } DEB printf("Po zdjęciu konców: %lld\n",ads); } if(ok) break; } if(ok) printf("%d",res); else printf("1"); return 0; } |
English