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