#include <iostream>
using namespace std;
char printNext(char last, bool left)
{
char next = 'a';
if (last == 'a')
{
next = (left ? 'b' : 'c');
}
else if (last == 'b')
{
next = (left ? 'a' : 'c');
}
else
{
next = (left ? 'a' : 'b');
}
cout << next;
return next;
}
int main()
{
uint64_t n, k;
cin >> n >> k;
if (n < 60 && k > 3 * ((1 << n) - 1))
{
cout << "NIE" << endl;
return 0;
}
++n;
char last = 'c';
uint64_t root = 0;
while (true)
{
if (n > 62)
{
last = printNext(last, true);
++root;
if (root == k)
return 0;
--n;
continue;
}
uint64_t left = root + 1;
uint64_t right = left + ((uint64_t)1 << (n - 1)) - 1;
uint64_t third = right + ((uint64_t)1 << (n - 1)) - 1;
if (k < right)
{
last = printNext(last, true);
if (left == k)
return 0;
root = left;
}
else if (root == 0 && k >= third)
{
last = printNext('a', false);
if (third == k)
return 0;
root = third;
}
else
{
last = printNext(last, false);
if (right == k)
return 0;
root = right;
}
--n;
}
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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | #include <iostream> using namespace std; char printNext(char last, bool left) { char next = 'a'; if (last == 'a') { next = (left ? 'b' : 'c'); } else if (last == 'b') { next = (left ? 'a' : 'c'); } else { next = (left ? 'a' : 'b'); } cout << next; return next; } int main() { uint64_t n, k; cin >> n >> k; if (n < 60 && k > 3 * ((1 << n) - 1)) { cout << "NIE" << endl; return 0; } ++n; char last = 'c'; uint64_t root = 0; while (true) { if (n > 62) { last = printNext(last, true); ++root; if (root == k) return 0; --n; continue; } uint64_t left = root + 1; uint64_t right = left + ((uint64_t)1 << (n - 1)) - 1; uint64_t third = right + ((uint64_t)1 << (n - 1)) - 1; if (k < right) { last = printNext(last, true); if (left == k) return 0; root = left; } else if (root == 0 && k >= third) { last = printNext('a', false); if (third == k) return 0; root = third; } else { last = printNext(last, false); if (right == k) return 0; root = right; } --n; } return 0; } |
English