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
#include <bits/stdc++.h>
#define endl '\n'
#define sz(x) ((int)x.size())
using namespace std;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n;
	long long int k;
	string odp;
	bool czy_zmiana = false, trzeba_konczyc = false;
	cin >> n >> k;
	if(n > 61) {
		czy_zmiana = true;
		while(n != 61) {
			if(odp.length() == 0 || odp[odp.length()-1] == 'b') odp += "a";
			else odp += "b";
			--n;
			--k;
			if(k == 0) {
				trzeba_konczyc = true;
				cout << odp << endl;
				break;
			}
		}
		if(k > (long long)pow(2,n) - 1) {
			if(odp[odp.length()-1] == 'c') odp += "b";
			else odp += "c";
		}
		else {
			if(odp[odp.length()-1] == 'a') odp += "b";
			else odp += "a";
		}
	}
	long long int licz = 3*(  (long long)pow(2,n)-1);
	if(trzeba_konczyc == false && k <= licz) {
		if(czy_zmiana == false) {
			if(k <= licz/3) {
				odp += "a";
			}
			else if(k <= 2*(licz/3)) {
				odp += "b";
				k -= (licz/3);
			}
			else {
				odp += "c";
				k -= 2*(licz/3);
			}
		}
		long long int pot = (long long)pow(2, n-1);
		long long int num = 1;
		while(num != k) {
			if(k < num + pot) {
				pot /= 2;
				num++;
				if(odp[odp.length()-1] == 'a') odp += "b";
				else odp += "a";
			}
			else {
				num += pot;
				pot /= 2;
				if(odp[odp.length()-1] == 'c') odp += "b";
				else odp += "c";
			}
		}
		cout << odp << endl;
	}
	else if (trzeba_konczyc == false) cout << "NIE" << endl;

	return 0;
}