#include <cstdio>
#include <climits>
#include <string>
#define LL unsigned long long
#define MAX_LENGTH 1000010
#define INF ULLONG_MAX
char solution[MAX_LENGTH];
#define DBG(X)
LL total_x(int n) {
  // return 2^n - 1
  if (n <= 62) return ((1LLU << n) - 1);
  else return INF;  
}
char smallestL[3] = {1, 0, 0};
char nextL[3] = {2, 2, 1};
int kth_x(int n, LL k, char first_litera, int idx) {
    solution[idx] = first_litera + 'a';
    while (k) {
        LL med = total_x(n-1);
        if (k <= med) {
            first_litera = smallestL[first_litera];
            k--;
        } else {
            first_litera = nextL[first_litera];
            k = k - med - 1;
        }
        n -= 1;
        idx++;
        solution[idx] = first_litera + 'a';
    }
    solution[idx+1] = 0;
    return 0;
}
int kth(int n, LL k, int idx) {
    DBG(printf("%d %llu = \n", n, k));
    for (int litera=0; litera < 3; litera++) {
        if (k < total_x(n)) {
            // zacznij od litery
            DBG(printf("First letter: %c\n", 'a' + litera));
            return kth_x(n, k, litera, idx);
        }
        k -= total_x(n);
    }
    sprintf(solution, "NIE");
    return 0;
}
void selftest() {
    int n = 100;
    std::string last_string = "";
    LL start_k = 100000000000000000LLU;    
    for (LL k=start_k; k < start_k+100; k++) {
        kth(n, k, 0);
        std::string s = std::string(solution);
        if (s <= last_string) {
            printf("error because %s is lower lexicographically than %s\n", s.c_str(), last_string.c_str());
        }
        printf("%d %llu %s\n", n, k, solution);
        last_string = s;
    }
}
int main() {
    // selftest();
    int n;
    LL k;
    while (scanf("%d%llu", &n, &k) > 1) {   
        kth(n, k-1, 0); 
        printf("%s\n", solution);
    }
    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 | #include <cstdio> #include <climits> #include <string> #define LL unsigned long long #define MAX_LENGTH 1000010 #define INF ULLONG_MAX char solution[MAX_LENGTH]; #define DBG(X) LL total_x(int n) { // return 2^n - 1 if (n <= 62) return ((1LLU << n) - 1); else return INF; } char smallestL[3] = {1, 0, 0}; char nextL[3] = {2, 2, 1}; int kth_x(int n, LL k, char first_litera, int idx) { solution[idx] = first_litera + 'a'; while (k) { LL med = total_x(n-1); if (k <= med) { first_litera = smallestL[first_litera]; k--; } else { first_litera = nextL[first_litera]; k = k - med - 1; } n -= 1; idx++; solution[idx] = first_litera + 'a'; } solution[idx+1] = 0; return 0; } int kth(int n, LL k, int idx) { DBG(printf("%d %llu = \n", n, k)); for (int litera=0; litera < 3; litera++) { if (k < total_x(n)) { // zacznij od litery DBG(printf("First letter: %c\n", 'a' + litera)); return kth_x(n, k, litera, idx); } k -= total_x(n); } sprintf(solution, "NIE"); return 0; } void selftest() { int n = 100; std::string last_string = ""; LL start_k = 100000000000000000LLU; for (LL k=start_k; k < start_k+100; k++) { kth(n, k, 0); std::string s = std::string(solution); if (s <= last_string) { printf("error because %s is lower lexicographically than %s\n", s.c_str(), last_string.c_str()); } printf("%d %llu %s\n", n, k, solution); last_string = s; } } int main() { // selftest(); int n; LL k; while (scanf("%d%llu", &n, &k) > 1) { kth(n, k-1, 0); printf("%s\n", solution); } return 0; } | 
 
            
         English
                    English