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