Cod sursa(job #43918)

Utilizator astronomyAirinei Adrian astronomy Data 30 martie 2007 17:40:05
Problema Expresii 2 Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.77 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXN 32

typedef long long llong;

int N, K;
llong P, res, A[MAXN][MAXN], B[MAXN][MAXN][MAXN], pk[MAXN];
char sol[MAXN];

void preproc(void)
{
    int i, j, k, d;

    for(pk[0] = 1, i = 1; i <= N; i++)
        pk[i] = pk[i-1]*K;
        
    for(d = 1; d >= (-N); d--)
    {
        memset(B, 0, sizeof(B));
        B[0][0][0] = 1;
        for(i = 0; i < N; i++)
        {
            for(j = 0; j <= N; j++)
             for(k = 0; k <= N; k++)
             {
                // bag variabila
                if(j+1-k >= d)
                    B[i+1][j+1][k] += B[i][j][k];
                // bag operator
                if(j-(k+1) >= d)
                    B[i+1][j][k+1] += 2*B[i][j][k];
                // bag !
                B[i+1][j][k] += B[i][j][k];
             }
            for(j = 0; j <= N; j++)
             for(k = 0; k <= N; k++)
              if(j-k == d)
                A[i+1][(-d)+1] += B[i+1][j][k]*pk[j];
        }
    }

    // calculez solutia
    for(i = 1; i <= K; i++)
        res += A[N-1][1];
}

void baga(int i, int d, llong P)
{
    int k;
    llong t;
    
    if(i == N)
    {
        if(d == 0)
            sol[i] = '!';
        else
            if(P == 1)
                sol[i] = '+';
            else
                sol[i] = '*';
        return ;
    }

    // incerc caracter
    
    for(t = 0, k = 0; k < K; k++)
    {
        t += A[N-i][-(d-1)+1];
        if(t >= P)
        {
            t -= A[N-i][-(d-1)+1], P -= t;
            sol[i] = 'A'+k;
            baga(i+1, d-1, P);
            return ;
        }
    }

    // +
    if(d+1 < 1)
    {
        t += A[N-i][-(d+1)+1];
        if(t >= P)
        {
            t -= A[N-i][-(d+1)+1], P -= t;
            sol[i] = '+';
            baga(i+1, d+1, P);
            return ;
        }
    }

    // *
    if(d+1 < 1)
    {
        t += A[N-i][-(d+1)+1];
        if(t >= P)
        {
            t -= A[N-i][-(d+1)+1], P -= t;
            sol[i] = '*';
            baga(i+1, d+1, P);
            return ;
        }
    }

    // !
    P -= t, sol[i] = '!';
    baga(i+1, d, P);
}

void read_data(void)
{
    scanf("%d %d %lld\n", &N, &K, &P);

    if(N == 1)
    {
        printf("%d\n", K);
        printf("%c\n", 'A'+K-1);
        exit(0);
    }
}

void write_data(void)
{
    int i;
    
    printf("%lld\n", res);

    for(i = 1; i <= N; i++)
        printf("%c", sol[i]);
    printf("\n");
}

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

    read_data();
    preproc();
    baga(1, 1, P);
    write_data();

    return 0;
}