Pagini recente » Cod sursa (job #304226) | Cod sursa (job #2934625) | Cod sursa (job #1931641) | Cod sursa (job #2711896) | Cod sursa (job #1585817)
#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(long long x = 1; x <= 26; ++x)
{
p = x;
current_case = 0;
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;
}