Cod sursa(job #1565228)

Utilizator akaprosAna Kapros akapros Data 10 ianuarie 2016 15:48:14
Problema Lampa Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.62 kb
#include <bits/stdc++.h>
#define maxL 75030
#define maxl 3027199
#define maxN 27
using namespace std;
int a, b, n, l, fib[maxN], nrsol;
char s[maxl];
char w[2][maxL], t[maxL];
void conc(int n)
{
    int i;
    w[0][0] = '0';
    w[1][0] = '1';
    for (i = 2; i < n; ++ i)
    {
        strcpy(t, w[i & 1]);
        strcat(t, w[(i - 1) & 1]);
        strcpy(w[i & 1], t);
        memset(t, 0, sizeof(t));
    }
}
int eq(int p, int l, int q)
{
    int i;
    for (i = 0; i < l; ++ i)
        if (s[i + p] != s[i + q])
            return 0;
    return 1;
}
int ok(int x, int y)
{
    int i, p = 0, a = 0, b = x, k = (n - 1) & 1;
    if (n % 2 == 0)
    {
        b = 0;
        a = y;
    }
    p =0;
    for (i = 0; i < fib[n + 1]; ++ i)
    {
        if (w[k][i] == '0' && !eq(p, x, a))
            return 0;
        if (w[k][i] == '1' && !eq(p, y, b))
            return 0;
        if (w[k][i] == '0')
            p += x;
        else
            p += y;
    }
    return 1;
}
void read()
{
    freopen("lampa.in", "r", stdin);
    scanf("%d %d\n", &n, &l);
    gets(s);
}
void solve()
{
    int i, x, y;
    fib[2] = 1;
    for (i = 3; i <= n + 1; ++ i)
        fib[i] = fib[i - 1] + fib[i - 2];
    conc(n);
    if (n % 2)
    {
        for (x = 1; x <= (l - 1) / fib[n - 1]; ++ x)
            if ((l - fib[n - 1] * x) % fib[n] == 0)
            {
                y = (l - fib[n - 1] * x) / fib[n];
                if (x && y && ok(x, y))
                {
                    a = x;
                    b = y;
                    break;
                }
            }
    }
    else
    {
        for (x = (l - 1) / fib[n - 1]; x >= 1; -- x)
            if ((l - fib[n - 1] * x) % fib[n] == 0)
            {
                y = (l - fib[n - 1] * x) / fib[n];
                ++ nrsol;
                if (ok(x, y))
                {
                    a = x;
                    b = y;
                    break;
                }
            }
    }
}
void write()
{
    int i;
    freopen("lampa.out", "w", stdout);
    if (a == b && a == 0)
    {
        printf("0");
        exit(0);
    }
    if (!(n % 2))
    {
        swap(a, b);
        for (i = a; i < a + b; ++ i)
            printf("%c", s[i]);
        printf("\n");
        for (i = 0; i < a; ++ i)
            printf("%c", s[i]);
    }
    else
    {
        for (i = 0; i < a; ++ i)
            printf("%c", s[i]);
        printf("\n");
        for (i = a; i < a + b; ++ i)
            printf("%c", s[i]);
    }
}
int main()
{
    read();
    solve();
    write();
    return 0;
}