Cod sursa(job #1585820)

Utilizator cautionPopescu Teodor caution Data 31 ianuarie 2016 15:18:29
Problema Expresii 2 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <fstream>

constexpr int kMaxN = 30;

long long pd[kMaxN+1];

int main()
{
    std::ifstream in("expresii2.in");
    std::ofstream out("expresii2.out");
    int n, k;
    long long p;
    in>>n>>k>>p;
    pd[1] = k;
    for(int i = 2; i <= n; ++i) {
        for(int j = 1; j <= i-2; ++j) pd[i] += pd[j]*pd[n-1-j];
        pd[i] *= 2;
        pd[i] += pd[i-1];
    }
    out<<pd[n]<<'\n';

    int current_case = 0; //0 = no pre-expression, 1 = one pre-expression, 2 = two pre-expressions
    long long aux;
    for(int i = 1; i <= n; ++i) {
        switch(current_case) {
        case 0: //we can add only a letter
            aux = pd[n-i+1]/k;
            out<<static_cast<char>('A'+(p-1)/aux);
            p = (p-1)%aux+1;
            current_case = 1;
            break;
        case 1://we can either add a letter or a '!'
            aux = 0;
            for(int j = 1; j <= n-i-2; ++j) aux += pd[j];
            aux = aux*4 + 2*(n-i);
            if(aux == 0) aux = 1;
      //  out<<' '<<p<<','<<aux<<' ';
            if((p-1)/aux >= k || i==n) { //add a '!'
                out<<'!';
                p -= k*aux;
            }
            else { //we add a letter
                out<<static_cast<char>('A'+(p-1)/aux);
                p = (p-1)%aux+1;
                current_case = 2;
            }
            break;
        case 2: //we can add either '!' or the binary operators
            if(n>i+1) aux = 2*pd[n-i-1];
            else aux = 1;
          //  out<<' '<<p<<','<<aux<<' ';
            if(p <= aux) {
                out<<'+';
                current_case = 1;
            }
            else if(p <= aux*2) {
                out<<'*';
                p -= aux;
                current_case = 1;
            }
            else {
                p -= 2*aux;
                out<<'!';
            }
            break;
        }
    }
    out<<'\n';
    return 0;
}