Cod sursa(job #1005230)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 4 octombrie 2013 16:07:02
Problema Reguli Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include<stdio.h>
#include<string.h>

#define NMAX 500007
#define LL long long

int x, n, T, Ans;
int pi[NMAX];
LL 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(LL b[], int i)
{
    while(x > 0 && b[x + 1] != b[i])
        x = pi[x];
    if(b[x + 1] == b[i])
        ++ x;
}

void KMP(LL 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("%lld", &n);
    for(int i = 1; i <= n; ++ i)
        scanf("%lld", &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] && i % (i - pi[i]) != 0))
            if(i - pi[i] < Ans && perioada(n, i) == 1)
                Ans = i - pi[i];
    printf("%d\n", Ans);
    for(int i = 1; i <= Ans; ++ i)
        printf("%lld\n", a[i]);
    return 0;
}