Последовательность Фибоначчи - это хорошо известная последовательность, в которой каждая запись является суммой предыдущих двух, а первые две записи равны 1. Если мы возьмем по модулю каждого члена константу, последовательность станет периодической. Например, если бы мы решили вычислить последовательность мод 7, мы получили бы следующее:
1 1 2 3 5 1 6 0 6 6 5 4 2 6 1 0 1 1 ...
Это имеет период 16. Связанная последовательность, называемая последовательностью Пизано , определяется так, что a(n)
это период последовательности Фибоначчи при вычислении по модулю n.
задача
Вы должны написать программу или функцию, которая при получении n
будет вычислять и выводить период мод последовательности Фибоначчи n
. Это n-й член в последовательности Пизано.
Вы должны поддерживать только целые числа в диапазоне 0 < n < 2^30
Это соревнование по коду для игры в гольф, поэтому вы должны стремиться минимизировать размер исходного кода, измеряемый байтами.
Контрольные примеры
1 -> 1
2 -> 3
3 -> 8
4 -> 6
5 -> 20
6 -> 24
7 -> 16
8 -> 12
9 -> 24
10 -> 60
11 -> 10
12 -> 24
f(i),f(i+1)
может принимать не более n^2
значений мод n
. Таким образом, n
ограничение 2^30
может закончиться, производя период до 2^60
. Ограничение n <= 2^16
дало бы P(n) <= 2^32
.
f(i+2) = f(i+1)+f(i)
, что «состояние» машины, зацикливающейся на период, можно описать с помощью пары целых чисел мод n
. Есть в большинстве n^2
штатов, поэтому период не более n^2
. Ой! Википедия утверждает, что период не более 6n
. Не берите в голову мою мелочь.