/* dla n==3: a ab aba abc ac aca acb b ba bab bac bc bca bcb c ca cab cac cb cba cbc wszystkich słów o długości ==n jest 3*2^(n-1) wszystkich słów o długości <=n jest 3*(2^n-1) pierwsza litera = (k-1)/(2^n-1), >2 -> NIE po jej obcięciu problem się redukuje do k = (k-1)%(2^n-1), n-- w podproblemie: k==0 oznacza koniec słowa c nie może wystąpić wyjściową literę zwiększamy o 1 jeśli była nie większa niż poprzednia limity: 1<=n<=1e06<2^20 1<=k<=1e18<2^60 */ #include <stdio.h> int main() { unsigned n, c = 3; unsigned long long k, q, d; scanf("%u%llu", &n, &k); while (n>0 && k>0) { k--; q = (n>63?0:1llu<<n)-1; d = k/q; if (d>2) { puts("NIE"); return 0; } c = d+(d>=c); putchar("abc"[c]); k %= q; n--; } puts(""); 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 | /* dla n==3: a ab aba abc ac aca acb b ba bab bac bc bca bcb c ca cab cac cb cba cbc wszystkich słów o długości ==n jest 3*2^(n-1) wszystkich słów o długości <=n jest 3*(2^n-1) pierwsza litera = (k-1)/(2^n-1), >2 -> NIE po jej obcięciu problem się redukuje do k = (k-1)%(2^n-1), n-- w podproblemie: k==0 oznacza koniec słowa c nie może wystąpić wyjściową literę zwiększamy o 1 jeśli była nie większa niż poprzednia limity: 1<=n<=1e06<2^20 1<=k<=1e18<2^60 */ #include <stdio.h> int main() { unsigned n, c = 3; unsigned long long k, q, d; scanf("%u%llu", &n, &k); while (n>0 && k>0) { k--; q = (n>63?0:1llu<<n)-1; d = k/q; if (d>2) { puts("NIE"); return 0; } c = d+(d>=c); putchar("abc"[c]); k %= q; n--; } puts(""); return 0; } |