/*
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; } |
English