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
#include <iostream>
#include <string>

using namespace std;

const string litery = "abc";

char litera_do_dodania (bool starsza, char ost_litera)
{
    char lit;
    if (starsza)
    {
        if (ost_litera == litery.back())
            return *(litery.end()-2); // przedostatnia litera
        else
            return litery.back(); //ostatnia litera
    }
    else // mlodsza
    {
        if (ost_litera == litery.front())
            return *(litery.begin() +1); // druga litera
        else
            return litery.front(); // pierwsza litera
    }
}


int main(int argc, char *argv[])
{
    string slowo="";
    uint32_t n;
    uint64_t k, N; //N - liczba slow nie dluzszych niz n zaczynajacych sie na jedna z liter a,b,c

    cin>>n>>k;
    N = (1<<n) -1; //N = (2^n -1) - liczba slow nie dluzszych niz n zaczynajacych sie na jedna z liter a,b,c

    if (k > 3*N)
    {
       cout<<"NIE"<<endl;
       return 0;
    }

    int pierwsza = (k-1)/N;
    slowo.push_back(*litery.begin()+pierwsza);

    uint64_t pocz = 1 + pierwsza*N; // przedzialu numerow slow zaczynajacych sie znalezionym ciagiem liter
    uint64_t kon = (1+pierwsza)*N;

    while (N>0)
    {
        if (k==pocz)
            break; // znaleziono k-te slowo

        N /=2; // polowa pozostalych slow w przedziale zawiera kolejna litere mnlodsz, a druga polowa - starsza
        if (k <= pocz+N) //nastepna litera mlodsza
        {
            kon = pocz+N;
            pocz +=1; // slowo o numerze pocz nie zawiera wiecej liter
            // dodaj mlodsza litere
            slowo.push_back(litera_do_dodania(false, slowo.back()));
        }
        else
        {
            pocz += (N+1);
            // dodaj starsza litere
            slowo.push_back(litera_do_dodania(true, slowo.back()));
        }

    }


    cout<< slowo <<endl;

    return 0;
}