Cod sursa(job #721224)
#include <fstream>
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;
}