Skip to content

Instantly share code, notes, and snippets.

@AnthonyMikh
Created February 6, 2018 21:45
Show Gist options
  • Save AnthonyMikh/d694ad13c738ce4dd3984db10a7e9517 to your computer and use it in GitHub Desktop.
Save AnthonyMikh/d694ad13c738ce4dd3984db10a7e9517 to your computer and use it in GitHub Desktop.
Решение задачи №68 от UniLecs
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
fibs2 = map (*2) fibs
solution n = fibs2 !! n
main = print $ solution 8
-- > 68
@AnthonyMikh
Copy link
Author

@AnthonyMikh
Copy link
Author

AnthonyMikh commented Feb 7, 2018

Доказательство формулы:
Назовём последовательность из 4 и 7 фиксированной длины, в которой ни одна цифра не повторяется подряд более, чем два раза, валидной. Валидную последовательность, начинающуюся с 4, назовём 4-валидной (понятие 7-валидной вводится по аналогии). Найдём число 4-валидных последовательностей длины n. Для небольших n это число V4(n) можно найти полным перебором:

V4(1) = 1 (4)
V4(2) = 2 (44, 47)
V4(3) = 3 (447, 474, 477)

Теперь допустим, что нам известно V4(n), и мы хотим найти V4(n+1). Для этого возьмём все 4-валидные последовательности длины n и будем приписывать цифру в конце. Вне зависимости от конкретного содержания всегда можно из 4-валидной последовательности получить 4-валидную последовательность длиной на единицу больше, если приписать цифру, отличную от цифры на конце. Когда же можно приписать цифру, совпадающую с конечной? Очевидно, когда две последние цифры различны. Число 4-валидных последовательностей длины n, две последние цифры которой различны, равно V4(n-1), т. к. такую последовательность можно получить из любой 4-валидной последовательности длины n-1, просто приписав цифру, отличную от конечной. Т. о.,
V4(n+1) = V4(n) + V4(n-1),
то есть с точностью до индексов совпадает с последовательностью чисел Фибоначчи. V4(n) = F(n+1), где F(n) - n-ое число Фибоначчи (F(1) = 1, F(2) = 1).
Теперь рассмотрим преобразование f: 4 -> 7, 7 -> 4. Если к каждой цифре 4-валидной последовательности применить f, получим 7-валидную последовательность, и наоборот. Т. к. это преобразование, очевидно, взаимно однозначное, получаем, что V4(i) = V7(i), а т. к. сумма количеств 4-валидных и 7-валидных последовательностей заданной длины равно количеству валидных последовательностей заданной длины, получаем, что для длины n их число задаётся формулой 2*V4(n) = 2*F(n+1), что и требовалось доказать.

@AnthonyMikh
Copy link
Author

Функция fibs возвращает бесконечный список чисел Фибоначчи. Функция fibs2 возвращает бесконечный список удвоенных чисел Фибоначчи. Оператор индексации !! возвращает n+1 элемент списка (т. к. индекс начинается с нуля).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment