Поскольку K низкое значение, оно естественным образом падает при возведении в матрицу.
Каждый элемент может закончить самое большее K позиций от его начальной позиции. Это дает максимум (2 K - 1) позиций, но некоторые позиции уже могут быть заняты. Вы можете иметь 2 2 K - 1 возможных конфигураций (из ближайших (2 K -1) слотов) при размещении предмета. Каждый новый элемент в любой незанятой позиции будет генерировать новую конфигурацию, новую и новую ...
Вам необходимо выяснить, сколько способов вы можете получить от каждой конфигурации до каждой другой. Вы можете использовать для этого грубую силу и сохранить значения. Когда вы знаете это, вы можете поместить числа в матрицу; Каждый столбец является конфигурацией, а каждая строка - конфигурацией.
Рассмотрим вектор отсчета v ; Каждая ячейка в ней представляет количество способов добраться до какой-либо конфигурации за n шагов. Начните с начального вектора счета (все нули, кроме одного 1, представляющего пустую конфигурацию, n = 0). Если вы умножите этот вектор на матрицу ( v x A ), вы сдвинете эти значения на один шаг вперед ( n = 1). Повторите для дополнительных шагов.
Теперь самое интересное. Если вы умножите эту матрицу на себя ( A x A ), вы получите матрицу для продвижения вперед на два поколения. Снова ( A 2 x A 2 ), и вы получите матрицу для перемещения 4 поколений. Вы можете использовать эту технику, чтобы продвинуть ее на несколько тысяч (или миллионов) поколений вперед всего за несколько итераций.
Вы можете узнать больше о возведении в степень, возведя в квадрат в Википедии.
Если вышеупомянутое слишком медленно, вы можете попытаться найти рекуррентное соотношение для найденных значений. Возьмите первые несколько значений последовательности и поместите их в систему уравнений:
a & middot; x 1 + b & middot; x 2 = x 3
a & middot; x 2 + b & middot; х 3 = х 4
Решите для a и b . Затем, чтобы сгенерировать последовательность, вы умножаете последние два числа на a и b и добавляете, чтобы получить следующее.
Если это не воспроизводит последовательность, вы можете увеличить размер:
a & middot; x 1 + b & middot; x 2 + c & middot; x 3 = x 4
a & middot; x 2 + b & middot; x 3 + c & middot; x 4 = x 5
a & middot; x 3 + b & middot; x 4 + c & middot; x 5 = x 6
Решите для a , b и c . Увеличивайте дальше, пока не получите то, что работает. Если вы сделаете еще один шаг, вы должны получить недостаточно определенную систему.
Может случиться, что нет рекуррентного отношения (по крайней мере, линейного). В этом случае вы можете увеличить размер, но вы никогда не найдете ничего, что работает.
Взять простой пример. Давайте рассмотрим K = 1. Это даст нам окрестность размера 3 (= 2 K + 1) и 8 различных конфигураций (= 2 2 K + 1 ).
Чтобы выбрать нотацию, я буду использовать #
для занятых или недоступных и .
бесплатно.
Чтобы сгенерировать матрицу, мы должны рассмотреть, какие шаблоны можно преобразовать в какие, добавив один символ.
Для паттернов, начинающихся со свободного слота, мы должны поместить следующий символ в крайнее левое положение.В противном случае в последовательности был бы пробел.
Для шаблона ###
у нас нет свободных мест для размещения чего-либо, так что это тупик.
Для остальных шаблонов можно поместить символ в любое свободное место, а затем сдвинуть шаблон на один пробел (переместившись в следующую позицию).
Матрица может выглядеть так:
... ..# .#. .## #.. #.# ##. ###
... 1 0 0 0 0 0 0 0
..# 0 0 1 0 0 0 0 0
.#. 0 0 0 0 1 0 0 0
.## 0 0 0 0 0 0 1 0
#.. 0 0 1 0 1 0 0 0
#.# 0 0 0 0 0 0 1 0
##. 0 0 0 0 0 0 1 0
### 0 0 0 0 0 0 0 0
В качестве исходного шаблона мы возьмем #..
.Это потому, что мы не можем поместить первый символ перед началом последовательности.Последовательность из одного символа может быть записана только одним способом, поэтому начальный вектор-счет становится 0 0 0 0 1 0 0 0
.
Последний требуемый шаблон - #..
.После конца последовательности нет символа, но остальные должны быть заполнены.Модель такова после смены.Это означает, что мы хотим посмотреть на положение 5 в векторе (считая от 1).
Первые несколько значений, которые мы получаем:
n p(n,1)
1 1
2 2
3 3
4 5
5 8
6 13
7 21
8 34
Конечно, большая часть матрицы избыточна,Вы можете потратить некоторое время на устранение строк и столбцов.Я не буду демонстрировать это.
Как только у нас будет несколько значений, мы можем попытаться найти отношение повторения.Сначала давайте попробуем систему размера 1:
1 · a = 2
Это решило бы a =2. Но если мы попробуем следующее значение, мы увидим, что в случае сбоя уже на следующем значении:
2 · a = 2 · 2 = 4 ≠ 3.
Далее, попробуем систему размера 2:
1 · a + 2 · b = 3
2 · a + 3 · b = 5
Это решает до a = b =1. Это фактически сгенерирует всю последовательность.
3 · a + 5 · b = 3 · 1 + 5 · 1 = 8
5 · a + 8 · b = 5 · 1 + 8 · 1 = 13
...
Если мы попробуем четноебольшая система, мы столкнемся с проблемами:
1 · a + 2 · b + 3 · c = 5
2 · a + 3 · b + 5 · c = 8
3 · a + 5 · b + 8 · c = 13
Thявляется решающим для a = 1 - c , b = 2 - c , без значения для c .
Если мы попробуем последовательность для K = 2 (генерируется с помощью вышеуказанного метода): 1 2 6 14 31 73 172 400 932 2177
Это не будетдать правильное решение до размера 5: a = -1, b = 0, c = 2, d = 0, e = 2. Это то же отношение, которое вы нашли.