#include <cstdio>
#include <set>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <string.h>
#include <stdio.h>
using namespace std;
// Dwa z najczesciej uzywanych typow o dlugich nazwach - ich skrocenie jest bardzo istotne
typedef vector<int> VI;
typedef long long LL;
// W programach bardzo rzadko mozna znalezc w pelni zapisana instrukcje petli. Zamiast niej, wykorzystywane sa trzy nastepujace makra:
// FOR - petla zwiekszajaca zmienna x od b do e wlacznie
#define FOR(x, b, e) for(int x = b; x <= (e); ++x)
// FORD - petla zmniejszajaca zmienna x od b do e wlacznie
#define FORD(x, b, e) for(int x = b; x >= (e); --x)
// REP - petla zwiekszajaca zmienna x od 0 do n. Jest ona bardzo czesto wykorzystywana do konstruowania i przegladania struktur danych
#define REP(x, n) for(int x = 0; x < (n); ++x)
// Makro VAR(v,n) deklaruje nowa zmienna o nazwie v oraz typie i wartosci zmiennej n. Jest ono czesto wykorzystywane podczas operowania na iteratorach struktur danych z biblioteki STL, ktorych nazwy typow sa bardzo dlugie
#define VAR(v, n) __typeof(n) v = (n)
// ALL(c) reprezentuje pare iteratorow wskazujacych odpowiednio na pierwszy i za ostatni element w strukturach danych STL. Makro to jest bardzo przydatne chociazby w przypadku korzystania z funkcji sort, ktora jako parametry przyjmuje pare iteratorow reprezentujacych przedzial elementow do posortowania.
#define ALL(c) (c).begin(), (c).end()
// Ponizsze makro sluzy do wyznaczania rozmiaru struktur danych STL. Uzywa sie go w programach, zamiast pisac po prostu x.size() z uwagi na fakt, iz wyrazenie x.size() jest typu unsigned int i w przypadku porownywania z typem int, w procesie kompilacji generowane jest ostrzezenie.
#define SIZE(x) ((int)(x).size())
// Bardzo pozyteczne makro, sluzace do iterowania po wszystkich elementach w strukturach danych STL.
#define FOREACH(i, c) for(VAR(i, (c).begin()); i != (c).end(); ++i)
// Skrot - zamiast pisac push_back podczas wstawiania elementow na koniec struktury danych, takiej jak vector, wystarczy napisac PB
#define PB push_back
// Podobnie - zamiast first bedziemy pisali po prostu ST
#define ST first
// a zamiast second - ND.
#define ND second
int nex[4][4] = {
		{1,2,-1,0},
		{0,2,-1,0},
		{0,1,-1,0},
		{0,1,2,-1},
};
bool inhere(LL &k, int n) {
	if (n > 62) return true;
	LL Tn = (((LL)1)<<n)-1;
	if(Tn >= k) return true;
	else { // Tn < k
		k -= Tn;
		return false;
	}
}
int main(int argc, char *argv[]) {
#define deb(x) cout << #x << " = " << x << endl;
	if (argc == 2 && strcmp(argv[1], "debug") == 0 ) {
		//        printf("== [RUNNING IN DEBUG MODE]==\n\n");
		char test_file_path[] = "/home/horban/workspace/Zadanka/in.txt";
		freopen(test_file_path, "r", stdin);
	}
	std::ios_base::sync_with_stdio(0);
	LL n, k;
	cin >> n >> k;
	VI r;
	while(k > 0) {
		int ind = r.empty() ? 3 : r.back();
		REP(i, 4) {
			int v = nex[ind][i];
			if (v == -1) {
				cout << "NIE" << endl;
				return 0;
			}
			if (inhere(k, n)) {
				r.PB(v); k-=1; n-=1;
				break;
			}
		}
	}
	FOREACH(it, r) {
		cout << (char)('a' + *it);
	}
	cout << 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 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | #include <cstdio> #include <set> #include <iostream> #include <algorithm> #include <string> #include <vector> #include <string.h> #include <stdio.h> using namespace std; // Dwa z najczesciej uzywanych typow o dlugich nazwach - ich skrocenie jest bardzo istotne typedef vector<int> VI; typedef long long LL; // W programach bardzo rzadko mozna znalezc w pelni zapisana instrukcje petli. Zamiast niej, wykorzystywane sa trzy nastepujace makra: // FOR - petla zwiekszajaca zmienna x od b do e wlacznie #define FOR(x, b, e) for(int x = b; x <= (e); ++x) // FORD - petla zmniejszajaca zmienna x od b do e wlacznie #define FORD(x, b, e) for(int x = b; x >= (e); --x) // REP - petla zwiekszajaca zmienna x od 0 do n. Jest ona bardzo czesto wykorzystywana do konstruowania i przegladania struktur danych #define REP(x, n) for(int x = 0; x < (n); ++x) // Makro VAR(v,n) deklaruje nowa zmienna o nazwie v oraz typie i wartosci zmiennej n. Jest ono czesto wykorzystywane podczas operowania na iteratorach struktur danych z biblioteki STL, ktorych nazwy typow sa bardzo dlugie #define VAR(v, n) __typeof(n) v = (n) // ALL(c) reprezentuje pare iteratorow wskazujacych odpowiednio na pierwszy i za ostatni element w strukturach danych STL. Makro to jest bardzo przydatne chociazby w przypadku korzystania z funkcji sort, ktora jako parametry przyjmuje pare iteratorow reprezentujacych przedzial elementow do posortowania. #define ALL(c) (c).begin(), (c).end() // Ponizsze makro sluzy do wyznaczania rozmiaru struktur danych STL. Uzywa sie go w programach, zamiast pisac po prostu x.size() z uwagi na fakt, iz wyrazenie x.size() jest typu unsigned int i w przypadku porownywania z typem int, w procesie kompilacji generowane jest ostrzezenie. #define SIZE(x) ((int)(x).size()) // Bardzo pozyteczne makro, sluzace do iterowania po wszystkich elementach w strukturach danych STL. #define FOREACH(i, c) for(VAR(i, (c).begin()); i != (c).end(); ++i) // Skrot - zamiast pisac push_back podczas wstawiania elementow na koniec struktury danych, takiej jak vector, wystarczy napisac PB #define PB push_back // Podobnie - zamiast first bedziemy pisali po prostu ST #define ST first // a zamiast second - ND. #define ND second int nex[4][4] = { {1,2,-1,0}, {0,2,-1,0}, {0,1,-1,0}, {0,1,2,-1}, }; bool inhere(LL &k, int n) { if (n > 62) return true; LL Tn = (((LL)1)<<n)-1; if(Tn >= k) return true; else { // Tn < k k -= Tn; return false; } } int main(int argc, char *argv[]) { #define deb(x) cout << #x << " = " << x << endl; if (argc == 2 && strcmp(argv[1], "debug") == 0 ) { // printf("== [RUNNING IN DEBUG MODE]==\n\n"); char test_file_path[] = "/home/horban/workspace/Zadanka/in.txt"; freopen(test_file_path, "r", stdin); } std::ios_base::sync_with_stdio(0); LL n, k; cin >> n >> k; VI r; while(k > 0) { int ind = r.empty() ? 3 : r.back(); REP(i, 4) { int v = nex[ind][i]; if (v == -1) { cout << "NIE" << endl; return 0; } if (inhere(k, n)) { r.PB(v); k-=1; n-=1; break; } } } FOREACH(it, r) { cout << (char)('a' + *it); } cout << endl; return 0; } | 
 
            
         English
                    English