#include<iostream> using namespace std; #define OGROMNA_WARTOSC 1000000000000000000LL #define IloscElementowDlaPoziomu(poziom) (poziom <= 63) ? (1ULL << poziom) - 1 : OGROMNA_WARTOSC struct LewyPrawy { int lewy; int prawy; LewyPrawy(int l, int p):lewy(l),prawy(p) {} }; int main() { //Kodujemy a - 0; b - 1; c - 2 ios_base::sync_with_stdio(0); unsigned long long n, k; unsigned long long aktualnyPoziom; unsigned long long iloscDlaAktualnyPoziom; int aktualnyWierzcholekZnak; unsigned long long aktualnyWierzcholekNrSlowa; char litery[3] = {'a', 'b', 'c'}; LewyPrawy nastepneLitery[3] = {LewyPrawy(1, 2), LewyPrawy(0, 2), LewyPrawy(0, 1)}; cin >> n >> k; aktualnyPoziom = n; iloscDlaAktualnyPoziom = IloscElementowDlaPoziomu(aktualnyPoziom); if(k <= iloscDlaAktualnyPoziom) { aktualnyWierzcholekZnak = 0; aktualnyWierzcholekNrSlowa = 1; } else if(k <= 2 * iloscDlaAktualnyPoziom) { aktualnyWierzcholekZnak = 1; aktualnyWierzcholekNrSlowa = 1 + iloscDlaAktualnyPoziom; } else if(k <= 3 * iloscDlaAktualnyPoziom) { aktualnyWierzcholekZnak = 2; aktualnyWierzcholekNrSlowa = 1 + 2 * iloscDlaAktualnyPoziom; } else { cout << "NIE"; return 0; } cout << litery[aktualnyWierzcholekZnak]; while(aktualnyWierzcholekNrSlowa != k) { --aktualnyPoziom; iloscDlaAktualnyPoziom = IloscElementowDlaPoziomu(aktualnyPoziom); if(k <= (aktualnyWierzcholekNrSlowa + iloscDlaAktualnyPoziom)) { aktualnyWierzcholekZnak = nastepneLitery[aktualnyWierzcholekZnak].lewy; aktualnyWierzcholekNrSlowa += 1; } else { aktualnyWierzcholekZnak = nastepneLitery[aktualnyWierzcholekZnak].prawy; aktualnyWierzcholekNrSlowa += (iloscDlaAktualnyPoziom + 1); } cout << litery[aktualnyWierzcholekZnak]; } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | #include<iostream> using namespace std; #define OGROMNA_WARTOSC 1000000000000000000LL #define IloscElementowDlaPoziomu(poziom) (poziom <= 63) ? (1ULL << poziom) - 1 : OGROMNA_WARTOSC struct LewyPrawy { int lewy; int prawy; LewyPrawy(int l, int p):lewy(l),prawy(p) {} }; int main() { //Kodujemy a - 0; b - 1; c - 2 ios_base::sync_with_stdio(0); unsigned long long n, k; unsigned long long aktualnyPoziom; unsigned long long iloscDlaAktualnyPoziom; int aktualnyWierzcholekZnak; unsigned long long aktualnyWierzcholekNrSlowa; char litery[3] = {'a', 'b', 'c'}; LewyPrawy nastepneLitery[3] = {LewyPrawy(1, 2), LewyPrawy(0, 2), LewyPrawy(0, 1)}; cin >> n >> k; aktualnyPoziom = n; iloscDlaAktualnyPoziom = IloscElementowDlaPoziomu(aktualnyPoziom); if(k <= iloscDlaAktualnyPoziom) { aktualnyWierzcholekZnak = 0; aktualnyWierzcholekNrSlowa = 1; } else if(k <= 2 * iloscDlaAktualnyPoziom) { aktualnyWierzcholekZnak = 1; aktualnyWierzcholekNrSlowa = 1 + iloscDlaAktualnyPoziom; } else if(k <= 3 * iloscDlaAktualnyPoziom) { aktualnyWierzcholekZnak = 2; aktualnyWierzcholekNrSlowa = 1 + 2 * iloscDlaAktualnyPoziom; } else { cout << "NIE"; return 0; } cout << litery[aktualnyWierzcholekZnak]; while(aktualnyWierzcholekNrSlowa != k) { --aktualnyPoziom; iloscDlaAktualnyPoziom = IloscElementowDlaPoziomu(aktualnyPoziom); if(k <= (aktualnyWierzcholekNrSlowa + iloscDlaAktualnyPoziom)) { aktualnyWierzcholekZnak = nastepneLitery[aktualnyWierzcholekZnak].lewy; aktualnyWierzcholekNrSlowa += 1; } else { aktualnyWierzcholekZnak = nastepneLitery[aktualnyWierzcholekZnak].prawy; aktualnyWierzcholekNrSlowa += (iloscDlaAktualnyPoziom + 1); } cout << litery[aktualnyWierzcholekZnak]; } return 0; } |