#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;
}
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; } |
English