Pagini recente » Cod sursa (job #2425675) | Cod sursa (job #1698109) | Cod sursa (job #662451) | Cod sursa (job #125447) | Cod sursa (job #43918)
Cod sursa(job #43918)
#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;
}