Cod sursa(job #3148212)

Utilizator moldovan_robert_lolMoldovan Robert moldovan_robert_lol Data 29 august 2023 19:54:02
Problema Expresii 2 Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#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][101];

int64_t sol(int last, int poz, int vars) {
	if (poz!=0&&vars<=0) return dp[last][poz][vars+50] = 0;
	if (poz==x) return dp[last][poz][vars+50] = vars==1;
	if (dp[last][poz][vars+50]!=-1) return dp[last][poz][vars+50];

	// '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+50] = ret;
}

void print_kth(int p) {
	int last = 0, poz = 0, vars = 0;
	for (int rep = 0; rep < x; rep++) {
		int i = 0;
		int last_good = 0;
		for (int j = 0; j <= k+2; j++) {
			if (sol(j,poz+1,vars+((j<k)?1:(j==k||j==k+1)?-1:0))) {
				last_good = j;
			}
		}

		while (i<last_good&&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
}