Cod sursa(job #589409)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 12 mai 2011 09:33:54
Problema Pavare2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.77 kb
#include <cstdio>
#include <cstring>

const int N_Max = 105, L_Max = 155;

typedef int Huge[L_Max];

Huge K, a[N_Max][N_Max], b[N_Max][N_Max];

int N, A, B;

void read() {
    char s[L_Max];

    scanf("%d%d%d\n", &N, &A, &B);

    gets(s);

    for (int i = strlen(s) - 1; i >= 0; -- i)
        K[++ K[0]] = s[i] - '0';
}

void init() {
    a[1][1][++ a[1][1][0]] = 1;
    b[1][1][++ b[1][1][0]] = 1;
}

void reset(Huge a) {
    for (int i = 0; i < L_Max; ++ i)
        a[i] = 0;
}

void adun(Huge a, Huge b) {
    int i = 0, T = 0;

    for (i = 1; i <= a[0] || i <= b[0] || T; ++ i) {
        a[i] += b[i] + T;
        T = a[i] / 10;
        a[i] %= 10;
    }

    a[0] = i - 1;
}

int comp(Huge a, Huge b) {
    if (a[0] < b[0])
        return - 1;

    if (a[0] > b[0])
        return 1;

    for (int i = a[0]; i >= 1; -- i)
        if (a[i] < b[i])
            return - 1;
        else if (a[i] > b[i])
            return 1;

    return 0;
}

void scade(Huge a, Huge b) {
    int T = 0;

    for (int i = 1; i <= a[0]; ++ i) {
        a[i] -= (b[i] + T);

        if (a[i] < 0) {
            T = 1;
            a[i] += 10;
        } else
            T = 0;
    }

    while (! a[a[0]])
        -- a[0];
}

void afis(Huge a) {
    for (int i = a[0]; i >= 1; -- i)
        printf("%d", a[i]);
    printf("\n");
}

void solve_a() {
    Huge rez;

    reset(rez);

    for (int i = 2; i <= N; ++ i) {
        for (int j = 1; j <= B; ++ j)
            adun(a[i][1], b[i - 1][j]);

        for (int j = 2; j <= A; ++ j)
            adun(a[i][j], a[i - 1][j - 1]);

        for (int j = 1; j <= A; ++ j)
            adun(b[i][1], a[i - 1][j]);

        for (int j = 2; j <= B; ++ j)
            adun(b[i][j], b[i - 1][j - 1]);
    }

    for (int j = 1; j <= A; ++ j)
        adun(rez, a[N][j]);

    for (int j = 1; j <= B; ++ j)
        adun(rez, b[N][j]);

    afis(rez);
}

void rez(int lastp, int lasts, int lastb) {
    if (lastp == 1)
        return;

    bool ok = false;

    int poz = 0;

    if (lastb == 0) {
        if (lasts == 1) {
            for (int j = 1; j <= B; ++ j)
                if (comp(K, b[lastp - 1][j]) <= 0) {
                    ok = true;
                    poz = j;
                    break;
                } else
                    scade(K, b[lastp - 1][j]);

            printf("1");
            rez(lastp - 1, poz, 1);
            return;
        }

        printf("0");
        rez(lastp - 1, lasts - 1, 0);
        return;
    }

    if (lastb == 1) {
        if (lasts == 1) {
            for (int j = A; j >= 1; -- j)
                if (comp(K, a[lastp - 1][j]) <= 0) {
                    ok = true;
                    poz = j;
                    break;
                } else
                    scade(K, a[lastp - 1][j]);

            printf("0");
            rez(lastp - 1, poz, 0);
            return;
        }

        printf("1");
        rez(lastp - 1, lasts - 1, 1);
        return;
    }
}

void solve_b() {
    bool ok = false;

    int poz = 0;

    for (int j = A; j >= 1; -- j)
        if (comp(K, a[N][j]) <= 0) {
            ok = true;
            poz = j;
            break;
        } else
            scade(K, a[N][j]);

    if (ok) {
        printf("0");
        rez(N, poz, 0);
        return;
    }

    for (int j = 1; j <= B; ++ j)
        if (comp(K, b[N][j]) <= 0) {
            ok = true;
            poz = j;
            break;
        } else
            scade(K, b[N][j]);

    printf("1");
    rez(N, poz, 1);
}

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

    read();

    init();
    solve_a();

    solve_b();

    return 0;
}