Pagini recente » Cod sursa (job #914798) | Cod sursa (job #516240) | Cod sursa (job #1140734) | Cod sursa (job #3295531) | Cod sursa (job #1005225)
#include<stdio.h>
#include<string.h>
#define NMAX 500007
int x, n, T, Ans;
int pi[NMAX];
int a[NMAX], b[NMAX];
inline bool perioada(int n, int Ind){
int p = n - Ind;
while(p)
if(pi[p] == n - Ind - 1)
return 1;
else
p = pi[p];
return 0;
}
void fa_x(int b[], int i)
{
while(x > 0 && b[x + 1] != b[i])
x = pi[x];
if(b[x + 1] == b[i])
++ x;
}
void KMP(int a[NMAX]){
memset(pi, 0, sizeof(pi));
for(int i = 2; i < n; ++ i)
{
fa_x(a, i);
pi[i] = x;
}
}
int main(){
freopen("reguli.in", "r", stdin);
freopen("reguli.out", "w", stdout);
scanf("%d", &n);
for(int i = 1; i <= n; ++ i)
scanf("%d", &b[i]);
for(int i = 1; i < n; ++ i)
a[i] = b[i + 1] - b[i];
KMP(a);
Ans = n - 1;
for(int i = 1; i < n; ++ i)
if(pi[i] != 0 && i % (i - pi[i]) != 0 && i - pi[i] < Ans && perioada(n, i) == 1)
Ans = i - pi[i];
printf("%d\n", Ans);
for(int i = 1; i <= Ans; ++ i)
printf("%d\n", a[i]);
return 0;
}