Cod sursa(job #1330870)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 31 ianuarie 2015 01:13:47
Problema Pavare2 Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.62 kb
#include <cstdio>
#include <vector>

#define Nmax 105

using namespace std;
int N,A,B,K;
long long DPA[Nmax][Nmax],DPN[Nmax][Nmax];
/// DPA[i][j] in cate feluri putem pava i pietre primele j fiind albe
/// DPN[i][j] in cate feluri putem pava i pietre primele j fiind negre
vector<int> sol;

void Read(){
    scanf("%d%d%d%d",&N,&A,&B,&K);
}

void Solve(){
    DPA[1][1] = 1;
    DPN[1][1] = 1;
    for(int i = 2; i <= N; ++i)
    {
        for(int k = 1; k <= B && k < i; ++k)
            DPA[i][1] = DPA[i][1] + DPN[i-1][k]; /// schimb culoarea

        for(int k = 1; k <= A && k < i; ++k)
            DPN[i][1] = DPN[i][1] + DPA[i-1][k]; /// schimb culoarea

        for(int j = 2; j <= A && j <= i; ++j)
            DPA[i][j] = DPA[i-1][j-1]; /// prelungire
        for(int j = 2; j <= B && j <= i; ++j)
            DPN[i][j] = DPN[i-1][j-1]; /// prelungire
    }

    long long ans = 0;
    for(int i = 1; i <= A; ++i)
        ans += DPA[N][i];
    for(int i = 1; i <= B; ++i)
        ans += DPN[N][i];
    printf("%lld\n",ans);
}

void Print( long long a[Nmax][Nmax] )
{
        for(int i = 1; i <= N; ++i)
        {
            for(int j = 1; j <= N; ++j)
                printf("%d ",a[i][j]);
            printf("\n");
        }
        printf("\n-------------------------\n");
}

void Debug()
{
    Print(DPA);
    Print(DPN);

}

void Reconst()
{
    int lastA = 0,lastB = 0;
    long long crt = 0,gata;
    int tip = 0;
    for(int pz = N; pz >= 1; --pz)
    {
        gata = 0;
        if(tip == 0)
        {
            for(int j = A; j >= 1; --j) /// incerc sa pun cati mai multi de 0
            if(K > DPA[pz][j])
                K -= DPA[pz][j];
            else
            {
                for(int k = 1; k <= j; ++k)
                    sol.push_back(0);
                gata = 1;
                pz -= (j - 1);
                tip = 1;
                break;
            }
        }

        if(tip == 1 || !gata)
        {
            if(gata)
                continue;
            for(int j = 1; j <= B; ++j)
            if(K > DPN[pz][j])
                K -= DPN[pz][j];
            else
            {
                for(int k = 1; k <= j; ++k)
                    sol.push_back(1);
                pz -= (j - 1);
                tip = 0;
                break;
            }
        }

    }
    for(int i = 0; i < N; ++i)
        printf("%d",sol[i]);
    printf("\n");
}

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

    Read();
    Solve();
    ///Debug();
    Reconst();

    return 0;
}