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
import java.util.Scanner;

class slo {
	public static char[] chars = new char[]{'a', 'b', 'c'};

	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		int n = s.nextInt();
		long k = s.nextLong();
		char[] str = new char[n];
		boolean res = process(str, n, k);
		System.out.println(res ? new String(str) : "NIE");
	}

	public static boolean process(char[] str, int n, long k){
		char curC;
		long t;
		int ci;
		long tk;
		if(n > 60){
			str[0] = 'a';
			k--;
		}else{
			t = (2L << n - 1) - 1;
			if(k > 3 * t){
				return false;
			}

			ci = (int) (k / (t + 1));
			k -= t * ci + 1;
			str[0] = chars[ci];
			if(k <= 0)
				return true;
		}
		curC = str[0];
		for(int i = 1; i < n ; i++){
			if(n - i > 60){
				str[i] = nextChar(curC, 0);
				curC = str[i];
				k--;
				continue;
			}
			t = (2L << n - 1 - i) - 1;
			ci = (int) (k / (t + 1));
			str[i] = nextChar(curC, ci);
			curC = str[i];
			k -= t * ci + 1;
			if(k <= 0)
				return true;
		}
		return false;
	}


	public static char nextChar(char prevChar, int idx){
		int i = (prevChar << 1) + idx;
		switch(i){
			case 196:
			case 198:
				return 'a';
			case 194:
			case 199:
				return 'b';
			case 195:
			case 197:
				return 'c';
			default:
				return (char) 0;
		}
	}
}