Pagini recente » Cod sursa (job #1436007) | Cod sursa (job #3141799) | Cod sursa (job #1823486) | Cod sursa (job #1949934) | Cod sursa (job #3148209)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>
#include <cstdint>
#include <cstring>
#include <tuple>
std::ifstream fin("expresii2.in");
std::ofstream fout("expresii2.out");
int x, k;
int64_t p;
int64_t dp[32][32][32];
int64_t sol(int last, int poz, int vars) {
if (poz==x) return dp[last][poz][vars] = vars==1;
if (dp[last][poz][vars]!=-1) return dp[last][poz][vars];
// 'A'-'A'+k
int64_t ret = 0;
for (int i = 0; i < k; i++) {
ret += sol(i,poz+1,vars+1);
}
// + , *
if (vars>1) {
ret += sol(k,poz+1,vars-1);
ret += sol(k+1,poz+1,vars-1);
}
// !
if (vars>=1) {
ret += sol(k+2,poz+1,vars);
}
return dp[last][poz][vars] = ret;
}
void print_kth(int p) {
int last = 0, poz = 0, vars = 0;
for (int rep = 0; rep < x; rep++) {
int i = 0;
while (i<k+2&&p-sol(i,poz+1,vars+((i<k)?1:(i==k||i==k+1)?-1:0))>=0) {
p -= sol(i,poz+1,vars+((i<k)?1:(i==k||i==k+1)?-1:0));
++i;
}
if (i<k) {
fout << (char)(i+'A');
}
else if (i==k) {
fout << '+';
}
else if (i==k+1) {
fout << '*';
}
else {
fout << '!';
}
vars += ((i<k)?1:(i==k||i==k+1)?-1:0);
++poz;
last = i;
}
fout << "\n";
}
int main() {
fin >> x >> k >> p; --p;
memset(dp,-1,sizeof(dp));
fout << sol(0,0,0) << "\n";
print_kth(p);
#ifdef DBG
fout << "\n";
for (int64_t i = 0; i < sol(0,0,0); i++) {
print_kth(i);
}
#endif
}