#include <cstdio>
char decision[6] = {'b', 'c', 'a', 'c', 'a', 'b'};
int decision_aux(char letter) {
    return (((int)letter - (int)'a') << 1);
}
char found_word[62];
int main() {
    int n;
    long long k;
    scanf("%d %lld", &n, &k);
    if (n == 1) {
        if (k <= 3)
            printf("%c\n", 'a' + (char)(k - 1));
        else
            printf("NIE\n");
        return 0;
    }
    if ((long long)n >= k) {
        for (int new_k = (int)k, i = 0; i < new_k; ++i) {
            putchar('a');
            if (++i < new_k)
                putchar('b');
            else
                break;
        }
        putchar('\n');
        return 0;
    }
    int start_pos = ((n < 61) ? n : 61), where = start_pos;
    long long current = (long long)n, remainder = 1LL;
    while (current + remainder < k) {
        current += remainder;
        remainder = (remainder << 1) + 1;
        if (--where == 1) {
            if (current + remainder >= k) {
                found_word[1] = 'b';
                break;
            }
            if (current + (remainder << 1) >= k) {
                current += remainder;
                found_word[1] = 'c';
                break;
            }
            printf("NIE\n");
            return 0;
        }
    }
    int where_end = where - 1, where_to = n - (start_pos - where_end);
    if (where > 1)
        found_word[where] = 'c';
    while (++current < k) {
        ++where;
        remainder >>= 1;
        if (current + remainder < k) {
            current += remainder;
            found_word[where] = decision[decision_aux(found_word[where - 1]) + 1];
        }
        else
            found_word[where] = decision[decision_aux(found_word[where - 1])];
    }
    for (int i = 0; i < where_to; ++i) {
        putchar('a');
        if (++i < where_to)
            putchar('b');
        else
            break;
    }
    while (found_word[++where_end])
        putchar(found_word[where_end]);
    putchar('\n');
    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 | #include <cstdio> char decision[6] = {'b', 'c', 'a', 'c', 'a', 'b'}; int decision_aux(char letter) { return (((int)letter - (int)'a') << 1); } char found_word[62]; int main() { int n; long long k; scanf("%d %lld", &n, &k); if (n == 1) { if (k <= 3) printf("%c\n", 'a' + (char)(k - 1)); else printf("NIE\n"); return 0; } if ((long long)n >= k) { for (int new_k = (int)k, i = 0; i < new_k; ++i) { putchar('a'); if (++i < new_k) putchar('b'); else break; } putchar('\n'); return 0; } int start_pos = ((n < 61) ? n : 61), where = start_pos; long long current = (long long)n, remainder = 1LL; while (current + remainder < k) { current += remainder; remainder = (remainder << 1) + 1; if (--where == 1) { if (current + remainder >= k) { found_word[1] = 'b'; break; } if (current + (remainder << 1) >= k) { current += remainder; found_word[1] = 'c'; break; } printf("NIE\n"); return 0; } } int where_end = where - 1, where_to = n - (start_pos - where_end); if (where > 1) found_word[where] = 'c'; while (++current < k) { ++where; remainder >>= 1; if (current + remainder < k) { current += remainder; found_word[where] = decision[decision_aux(found_word[where - 1]) + 1]; } else found_word[where] = decision[decision_aux(found_word[where - 1])]; } for (int i = 0; i < where_to; ++i) { putchar('a'); if (++i < where_to) putchar('b'); else break; } while (found_word[++where_end]) putchar(found_word[where_end]); putchar('\n'); return 0; } | 
 
            
         English
                    English