Пусть f[n]
будет n
th числом Фибоначчи .
Предположим, что мы хотим найти значение в позиции x
в строке, полученной конкатенацией f[1], f[2], ..., f[n]
.
- Найдите самый низкий
k
такой, что f[1] + f[2] + ... + f[k] >= x
.Таким образом, позиция x
принадлежит слову, которое имеет f[k]
символов (по крайней мере, в конкатенации, которое оно имеет. Но так как все слова состоят из a
и b
, мы постараемся свести проблему только к темдва). - Чтобы найти положение, соответствующее
x
в выражении f[k]
, вычтите f[1] + ... + f[k - 1]
из x
. - , если
k = 1
, напечатайте a
, еслиk = 2
print b
, иначе перейти к шагу 4. - , если
f[k - 2] < x
, то позиция, которую мы ищем, находится в слове, соответствующем (с длиной) f[k - 1]
.Вычтите 1 из k
и f[k - 2]
из x
и перейдите к step 3 . - Иначе, искомая позиция находится в слове, соответствующем
f[k - 2]
,Вычтите 2 из k
, оставьте x
без изменений и перейдите к шаг 3 .
Это не требует генерации фактических слов, простоих длины, которые являются основными числами Фибоначчи.
Обработанный пример - обратите внимание, что я использую только фактические слова в целях иллюстрации, они не нужны.
n f[n] corresponding word
1 1 a
2 1 b
3 2 ab
4 3 bab
5 5 abbab
6 8 bababbab
Объединяя все это, мы получаем: ababbababbabbababbab
.Давайте спросим себя, что находится на позиции 10
(это b
).
1. f[1] + f[2] + f[3] + f[4] + f[5] >= 10, so k = 5
2. x = 10, f[1] + f[2] + f[3] + f[4] = 7, so subtract 7 from x, giving x = 3
3'. k isn't 1 or 2, skip this.
4'. f[k - 2 = 3] = 2 < x. k = 4, x = 1
3''. still ignoring this.
4'' f[k - 2 = 2] = 1 >= x. k = 2, x = 1
3'''. k = 2, print 'b'.