Если мы определим последовательность, подобную Фибоначчи, как f k (n) = (f k (n-1) + f k (n-2))% k , для некоторого целого числа k (где % - оператор по модулю), последовательность будет обязательно циклическим, потому что есть только k 2 различных значения для (f k (n-1), f k (n-2)) . Однако этот цикл обычно не включает все возможные пары значений, поэтому в зависимости от двух начальных значений f k (0) и f k (1) мы можем получить разные циклы. Например, для k = 2 у нас есть следующие четыре возможности, в зависимости от первых двух значений:
0, 0, 0, 0, 0, 0, 0, 0, 0, ...
0, 1, 1, 0, 1, 1, 0, 1, 1, ...
1, 0, 1, 1, 0, 1, 1, 0, 1, ...
1, 1, 0, 1, 1, 0, 1, 1, 0, ...
Из-за циклической природы последовательностей здесь действительно только две принципиально разные последовательности с орбитами (0) и (0, 1, 1) . Давайте посмотрим на к = 3 :
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, ...
0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, ...
1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, ...
1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, ...
1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, ...
2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, ...
2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, ...
2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, ...
Опять же, есть только две разные орбиты: (0) и (0, 1, 1, 2, 0, 2, 2, 1) .
Для более высоких k мы можем получить больше орбит, но они все равно попадут в сравнительно небольшое количество классов. Например, k = 4 дает четыре орбиты (0) , (0,1,1,2,3,1) , (0, 2, 2) , (0, 3, 3, 2, 1, 3) и k = 5 три орбиты (0) , (0, 1, 1, 2, 3, 0, 3, 3, 1, 4, 0, 4, 4, 3, 2, 0, 2, 2, 4, 1) и (1, 3, 4, 2) .
Ваша задача в этой задаче - вычислить, сколько орбит последовательность генерирует для данного k . Это OEIS A015134 . Вот первые 100 значений (начиная с k = 1 ):
1, 2, 2, 4, 3, 4, 4, 8, 5, 6, 14, 10, 7, 8, 12, 16, 9, 16, 22, 16,
29, 28, 12, 30, 13, 14, 14, 22, 63, 24, 34, 32, 39, 34, 30, 58, 19,
86, 32, 52, 43, 58, 22, 78, 39, 46, 70, 102, 25, 26, 42, 40, 27, 52,
160, 74, 63, 126, 62, 70, 63, 134, 104, 64, 57, 78, 34, 132, 101, 60,
74, 222, 37, 38, 62, 328, 89, 64, 82, 124, 41, 86, 42, 172, 75, 44,
184, 178, 181, 132, 82, 180, 99, 140, 104, 246, 49, 50, 114, 76
Удостоверьтесь, чтобы проверить k = 11 , который является первым входом, который дает больше чем k орбит.
правила
Вам дано положительное целое число k, и вы должны вывести A015134 (k) .
Вы можете написать программу или функцию и использовать любой из стандартных методов получения ввода и предоставления вывода.
Вы можете использовать любой язык программирования , но учтите, что эти лазейки по умолчанию запрещены.
Это код-гольф , поэтому самый короткий действительный ответ - измеренный в байтах - выигрывает.
источник
Ответы:
Шелуха ,
1716 байтПопробуйте онлайн!
объяснение
источник
Баш,
172,119,113, 91 байтПопробуйте онлайн
источник
Wolfram Language (Mathematica) ,
7670 байтПопробуйте онлайн!
Как это устроено
Построим граф, заданный по правилам,
{{0,0}->{0,0}, {1,0}->{1,1}, ...}
которые по двум элементам обобщенной последовательности Фибоначчи находят следующий по модулюn
.EdgeCycleMatrix
дает матрицу инцидентности от циклов до ребер в этом графе; мы хотим посчитать его строки.(Существует ряд встроенных модулей, выполняющих аналогичную задачу, но
ConnectedComponents
более длинных, и для их работыFindCycle
требуется много дополнительных входных данных. Кроме того,EdgeCycleMatrix
это прямоугольный массив, не такой смешной, как у двух других, что помогает позже. )Чтобы посчитать строки матрицы, мы берем факториал записей, чтобы превратить его в матрицу всех единиц, а затем берем трассировку. (Каждый цикл содержит по крайней мере одно ребро и, следовательно, столбцов, по крайней мере, столько же, сколько строк - поэтому здесь учитываются строки, а не столбцы.)
источник
MATL ,
3836 байтПопробуйте онлайн! Тайм-аут в онлайн-компиляторе для превышения ввода
7
.объяснение
Код определяет орбиты в терминах комплексных чисел, где мнимая часть - это новый термин, а действительная часть - предыдущий член в последовательности Фибоначчи. Каждое комплексное значение кодирует состояние последовательности. А именно, учитывая
a+jb
следующее значение вычисляется какb+j(a+b)
.Возможные начальные значения
a+jb
сa
,b
в[0, 1, ..., k-1]
. Для каждого начального значения код повторяетсяk^2
раз. На самом деле, чтобы сделать код короче, каждая итерация применяется ко всем накопленным таким образом значениям, и результаты дедуплицируются (что будет необходимо в конце концов). После последней итерации вектор дедуплицированных комплексных значений сортируется (по абсолютному значению, а затем по углу). Это дает «подпись» для каждой орбиты.В конце программы подписи собираются в массив ячеек. Количество уникальных подписей является желаемым результатом.
источник
Haskell ,
196191 байтПопробуйте онлайн!
Это может быть улучшено. Особенно, если кто-то может найти способ избежать
isInfixOf
и удалить импорт.Основная идея состоит в том, чтобы сгенерировать список «состояний» (кортежей, содержащих два предыдущих значения), чтобы увидеть, когда он начинает цикл. Затем мы проверяем, отличается ли каждая орбита от своих предшественников (действительно работает наоборот, но это трудно выразить словами). Чтобы проверить, одинаковы ли орбиты, мы проверяем, одинакова ли длина и совпадает ли одна с другой. Например
[0,2,2]
,[2,2,0]
: длина обоих равно 3 , и[0,2,2,0,2,2]
содержит[2,2,0]
как непрерывную подпоследовательности. Я не уверен, что это надежно, но, похоже, работает.РЕДАКТИРОВАТЬ: спасибо Laikoni за удаление 5 байтов! Я должен был прочитать больше этих советов.
источник
length
. Другой байт можно сохранить!
с помощью|r<-p++[a]=r!b
.JavaScript (ES6),
337335 байтИзвините за Ω (k ^ 3) алгоритм грубой силы.
Производительность ...
Когда я вычислял A015134 (что-то выше k = 50), он превышал предел 60 с на TIO.Объяснение (Ungolfed)
источник
Perl 5, 80 + 1 (-p) байтов
Попробуйте онлайн
источник
Желе , 17 байт
Попробуйте онлайн!
источник
JavaScript (ES6), 102 байта
Возвращает функцию, которая возвращает результат. Еще 3 байта мы можем сделать так, чтобы он возвращал результат напрямую:
Оба имеют временную сложность O (n 2 ).
источник
Python 2 , 214 байтов
Попробуйте онлайн!
Это не очень эффективно, но это самое лучшее, что я мог сделать.
источник