Cod sursa(job #1535199)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 24 noiembrie 2015 14:06:41
Problema Reguli Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <cstdio>

#define in "reguli.in"
#define out "reguli.out"
#define NMAX 500007
#define LL long long
#define DIM 100007

using namespace std;
int n, sol, poz;
LL v[NMAX], phi[NMAX];
char buff[DIM];

inline void citire(int &nr)
{
    nr = 0;
    while(buff[poz] < '0' || buff[poz] > '9')
    {
        ++poz;
        if(poz == DIM)
        {
            poz = 0;
            fread(buff, 1, DIM, stdin);
        }
    }
    while(buff[poz] <= '9' && buff[poz] >= '0')
    {
        nr = nr*10 + buff[poz] - '0';
        ++poz;
        if(poz == DIM)
        {
            poz = 0;
            fread(buff, 1, DIM, stdin);
        }
    }
}
inline void citire2(LL &nr)
{
    nr = 0;
    while(buff[poz] < '0' || buff[poz] > '9')
    {
        ++poz;
        if(poz == DIM)
        {
            poz = 0;
            fread(buff, 1, DIM, stdin);
        }
    }
    while(buff[poz] <= '9' && buff[poz] >= '0')
    {
        nr = nr*10 + buff[poz] - '0';
        ++poz;
        if(poz == DIM)
        {
            poz = 0;
            fread(buff, 1, DIM, stdin);
        }
    }
}

inline void solve()
{
    int k = 0;
    for(int i = 2; i<= n; ++i)
    {
        while(k && v[k+1] != v[i]) k = phi[k];
        if(v[k+1] == v[i]) ++k;
        phi[i] = k;
    }
}

int main()
{
    freopen(in, "r", stdin);
    freopen(out, "w", stdout);
    citire(n);
    for(int i = 1; i<= n; ++i) citire2(v[i]);
    for(int i = 2; i<= n; ++i) {v[i-1] -= v[i]; v[i-1]*=(-1);}
    --n;
    solve();
    sol = n - phi[n];
    printf("%d\n", sol);
    for(int i = 1; i<= sol; ++i) printf("%lld\n", v[i]);
    return 0;
}