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
83
84
85
86
87
88
89
90
91
92
#include <iostream>
#include <cstdio>
using namespace std;
long long t[70], k, p, q;
int n;
char c;
bool b;
void znajdz(long long p, long long q, char x)
{
     if(k==p) return;   
     p+=1;
     long long mid=(p+q)/2;
     if(k<=mid)
     {
         if(x=='a') 
         {
                    printf("%c", 'b');
                    znajdz(p,mid, 'b');
         }      
         else
         {
             printf("%c", 'a');
             znajdz(p,mid,'a');
         }
     }
     else
     {
         if(x=='c') 
         {
                    printf("%c", 'b');
                    znajdz(mid+1,q, 'b');
         }      
         else
         {
             printf("%c", 'c');
             znajdz(mid+1,q,'c');
         }
     }
}
int main()
{
    t[1]=1;
    for(int i=2;i<=61;i++) t[i]=t[i-1]*2+1;
    scanf("%d", &n);
    scanf("%d", &k);
    if(n>59)
    {
    	printf("%c", 'a');
    	n-=1;
    	p+=1;
    	b=1;
    	while(n>59 && p!=k)
    	{
    		n-=1;
    		p+=1;
    		if(b) printf("%c", 'b');
    		else printf("%c", 'a');
    		b=!b;
		}
		n=100;
		q=t[60];
		if(b) c='b';
		else c='a';
	}
    else if(k<=t[n])
    {
              p=1;
              q=t[n];
              printf("%c", 'a');
              c='a';
    }
    else if(k<=t[n]*2)
    {
              p=t[n]+1;
              q=2*t[n];
              printf("%c", 'b');
              c='b';
    }
    else if(k<=t[n]*3)
    {
              p=2*t[n]+1;
              q=3*t[n];
              printf("%c", 'c');
              c='c';
    }
     if(k<=3*t[n] || n==100)
	 {
	   if(p<k) znajdz(p,q,c);
	}
     else printf("NIE");
    return 0;
}