Pagini recente » Cod sursa (job #1173848) | Cod sursa (job #2453392) | Cod sursa (job #12122) | Cod sursa (job #538964) | Cod sursa (job #2898434)
#include <iostream>
#include <fstream>
std::fstream fileIn("planeta.in");
std::ofstream fileOut("planeta.out");
long long nrArboriCautare[31];
void calculNrArbori(int nr) {
nrArboriCautare[0] = 1;
nrArboriCautare[1] = 1;
for(int i = 2; i <= nr; ++i) // pt fiecare i calculez nr de arbori binari de cautare care se pot scrie cu nr 1...i
for( int j = 0; j < i; ++j) { // al doilea for pt nr elem subarborele din stg
nrArboriCautare[i] += nrArboriCautare[j] * nrArboriCautare[i-j-1]; // i-j-1 = nr de elem pt subarborele din dr
}
}
/// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
///
void gasesteArboreRSD(int ii, int sf, long long k) {
// deci avem inordinea (adica numerele in ordine de la 1 la n) si pe rand verific daca nr k e mai mare decat ce generez si scad pana ma apropii
int radCurenta;
for ( radCurenta = ii; radCurenta < sf ; ++radCurenta){
int nrSubarboreSt = radCurenta-ii;
int nrSubarboreDr = sf-radCurenta;
long long nrArb = nrArboriCautare[nrSubarboreSt] * nrArboriCautare[nrSubarboreDr];
if(nrArb <= k){
k = k - nrArb;
}
else {
break;// cand se opreste stiu ca nu mai e indeplinita conditia si a sarit nrArb de k
}
}
std::cout << radCurenta << ' ';
fileOut << radCurenta << ' ';
if(radCurenta > ii) { // daca e cazul ca nodul tocmai pus in preordine ca radCurenta sa aiba subarbore st -> tb sa ii gasim subarborele st
gasesteArboreRSD(ii, radCurenta - 1, k / nrArboriCautare[sf-radCurenta]);
}
if(radCurenta < sf) { // daca e cazul ca nodul tocmai pus in preordine ca radCurenta sa aiba subarbore drept -> tb sa ii gasim subarborele dr
gasesteArboreRSD(radCurenta + 1, sf , k % nrArboriCautare[sf-radCurenta]);
}
}
int main() {
int n;
long long w;
fileIn >> n;
calculNrArbori(n);
fileIn >> w;
gasesteArboreRSD(1,n,w - 1);
return 0;
}