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
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.math.BigInteger;
import java.util.Scanner;

public class slo {

	private static BigInteger L,K,L3,L32,LeftCount,h,start,end;
	private static int n;
	private static char c;
	private static BufferedWriter log = new BufferedWriter(new OutputStreamWriter(System.out));
	
	public static void main(String[] args) throws IOException {
		
		Scanner sc=new Scanner(System.in);
		n=sc.nextInt();
		K=BigInteger.valueOf(sc.nextLong());
		L3=BigInteger.ONE.shiftLeft(n).subtract(BigInteger.ONE);
		L32=L3.shiftLeft(1);
		L=L3.add(L32);
		if (L.subtract(K).signum()>=0) {
			if (L3.compareTo(K)>=0){
				c='a';
			}else if (L32.compareTo(K)>=0){
				K=K.subtract(L3);
				c='b';
			}else{
				K=K.subtract(L32);
				c='c';
			}
			start=BigInteger.ONE;
			end=L3;
			SearchTree();
			log.flush();
		} else {
			System.out.println("NIE");
		}
		sc.close();
	}
	
	private static void SearchTree() throws IOException{
		log.append(c);
		if (K.compareTo(start)!=0) {
			LeftCount=end.subtract(start).shiftRight(1);
			h=start.add(LeftCount);
			if (K.compareTo(h)>0) {
				c=getWorseChar(c);
				start=h.add(BigInteger.ONE);
				SearchTree();
			} else {
				c=getBetterChar(c);
				start=start.add(BigInteger.ONE);
				end=h;
				SearchTree();
			}
		}
	}
	
	private static char getBetterChar(char c){
		return c=='a'?'b':'a';
	}
	
	private static char getWorseChar(char c){
		return c=='c'?'b':'c';
	}
}