Cod sursa(job #217285)

Utilizator Mishu91Andrei Misarca Mishu91 Data 27 octombrie 2008 21:40:37
Problema Lampa Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <cstdio>
#include <string>
using namespace std;

#define MAX_N 20
#define MAX_M 3028000

int N;
long M, fib[MAX_N];
char buf[MAX_M];
string S, R;
    string A, B;


void gen_fib()
{
    fib[1] = fib[2] = 1;
    for(int i = 3; i <= N; ++i)
        fib[i] = fib[i - 1] + fib[i - 2];
}

int ver(int a, int b, bool k)
{
    char aux[MAX_M];
    string aux1, aux2;
    for(int i = 0; i < a; ++i)
        aux[i] = buf[i];
    aux[a] = 0;
    if(k)
        aux1 = A = string(aux);
    else
        aux2 = A = string(aux);
    for(int i = a; i < a+b; ++i)
        aux[i - a] = buf[i];
    aux[b] = 0;
    if(k)
        aux2 = B = string(aux);
    else
        aux1 = B = string(aux);
    aux[0] = 0;
    R = string(aux);

    for(int i = 3; i <= N; ++i)
    {
        R = aux1 + aux2;
        aux1 = aux2;
        aux2 = R;
    }
    if(R == S)
        return 1;
    return 0;
}

void solve()
{
    int x, y, t1 = fib[N - 2], t2 = fib[N - 1];
    for(x = 1; x <= M; ++x)
    {
        y = (M - x*t1) / t2;
        if((x*t1 + y*t2) == M)
            if(N & 1)
            {
                if(ver(x, y, 1))
                {
                    printf("%s\n%s",A.c_str(), B.c_str());
                    return;
                }
            }
            else
                if(ver(y, x, 0))
                {
                    printf("%s\n%s",B.c_str(), A.c_str());
                    return;
                }
    }
    printf("0\n");
}

int main()
{
    freopen("lampa.in","rt",stdin);
    freopen("lampa.out","wt",stdout);

    scanf("%d %ld\n",&N, &M);
    gen_fib();
    fgets(buf, sizeof(buf), stdin);
    if(buf[strlen(buf) - 1] == '\n')
        buf[strlen(buf) - 1] = 0;
    S = string(buf);
    solve();
}