Cod sursa(job #485136)

Utilizator DraStiKDragos Oprica DraStiK Data 17 septembrie 2010 11:58:46
Problema Expresii 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <algorithm>
using namespace std;

#define LIM 70
#define DIM 35

long long bst[DIM][DIM];
long long p;
char s[LIM];
int n,k,m;

void init ()
{
    int i,j;

    scanf ("%d%d%lld",&n,&k,&p);

    bst[0][0]=1;
    for (i=0; i<n; ++i)
        for (j=0; j<=i+1; ++j)
            if (!i || j)
            {
                if (j)
                    bst[i+1][j-1]+=bst[i][j]*k;
                if (i!=n-1)
                {
                    if (j)
                        bst[i+1][j]+=bst[i][j];
                    else
                        bst[i+1][j+1]+=bst[i][j];
                }
                if (j)
                    bst[i+1][j+1]+=bst[i][j]<<1;
                else
                    bst[i+1][j+2]+=bst[i][j]<<1;
            }
}

void solve ()
{
    int i,j,nrval,flag;

    nrval=0;
    bst[0][1]=1;
    for (i=0; i<n; ++i)
    {
        for (j='A'; j-'A'<k; ++j)
            if (p-bst[n-i-1][nrval+1]>0)
                p-=bst[n-i-1][nrval+1];
            else
                break ;
        if (j-'A'<k)
        {
            s[++m]=j;
            ++nrval;
        }
        else
        {
            flag=0;
            if (nrval>=2)
            {
                if (p-bst[n-i-1][nrval-1]>0)
                    p-=bst[n-i-1][nrval-1];
                else
                {
                    s[++m]='+';
                    flag=1;
                    --nrval;
                }
            }
            if (!flag && nrval>=2)
            {
                if (p-bst[n-i-1][nrval-1]>0)
                    p-=bst[n-i-1][nrval-1];
                else
                {
                    s[++m]='*';
                    flag=1;
                    --nrval;
                }
            }
            if (!flag)
                s[++m]='!';
        }
    }
}

void print ()
{
    int i;

    printf ("%lld\n",bst[n][0]);
    for (i=1; i<=m; ++i)
        printf ("%c",s[i]);
}

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

    init ();
    solve ();
    print ();

    return 0;
}