Cod sursa(job #1778804)

Utilizator silkMarin Dragos silk Data 14 octombrie 2016 09:51:59
Problema Lampa Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <cstdio>
#define NMax 3027200
#define Type 76000

int f1[Type+1];
int f2[Type+1];
int f3[Type+1];
int fib[Type+1];
char s[NMax+1];

int main(){
    freopen("lampa.in","r",stdin);
    freopen("lampa.out","w",stdout);

    int k,i,j,M,N,A,B,iA,iB,idx,ok=0;

    scanf("%d %d\n",&N,&M);
    fgets(s, NMax-1, stdin);

    fib[1] = 1;
    fib[2] = 1;
    for(i = 3; i <= N; ++i) fib[i] = fib[i-1] + fib[i-2];

    f1[0] = f2[0] = 1; f1[1] = 1; f2[1] = 2;
    for(i = 3; i <= N; ++i)
    {
        for(j = 1; j <= f1[0]; ++j) f3[j] = f1[j];
        for(j = 1; j <= f2[0]; ++j) f3[ j+f1[0] ] = f2[j];
        f3[0] = f1[0] + f2[0];
        for(j = 0; j <= f2[0]; ++j) f1[j] = f2[j];
        for(j = 0; j <= f3[0]; ++j) f2[j] = f3[j];
    }

    for(k = 1; k * fib[N-2] < M; ++k)
    if( ( M - k * fib[N-2] ) % fib[N-1] == 0 )
    {
        A = k;
        B = ( M - k * fib[N-2] ) / fib[N-1];

        if( N%2 ) { iA = 0; iB = A; }
        else { iB = 0; iA = B; }

        for(idx = 0, i = 1; i <= f2[0]; ++i)
        if( f2[i] == 1 )
        {
            for(j = iA; j < iA+A; ++j)
            if( s[idx++] ^ s[j] ) { j = iA+A; i = f2[0]+2; }
        }
        else
        {
            for(j = iB; j < iB+B; ++j)
            if( s[idx++] ^ s[j] ) { j = iB+B; i = f2[0]+2; }
        }

        if( i == f2[0]+1 ) { ok = 1; break; }
    }


    if(!ok) printf("0\n");
    else
    {
        for(i = iA; i < iA + A; ++i) printf("%c", s[i]);
        printf("\n");
        for(i = iB; i < iB + B; ++i) printf("%c", s[i]);
    }



return 0;
}