CJam ( 58 56 символів)
Деякі символи не друкуються, а один - це вкладка, яку буде керовано програмним забезпеченням StackExchange:
"¶3¬î¿Á· 7ÛÈmÈÚÚ¡"256b454b212f-{__W%.*A<1b+}qi*-4=
Інтернет демо . Це буде тривати в Інтернеті протягом n = 400 приблизно за три секунди.
Зашифровано xxd
:
0000000: 22b6 0233 93ac eebf c1b7 0609 3794 dbc8 "..3........7...
0000010: 6dc8 1015 dada a122 3235 3662 3435 3462 m......"256b454b
0000020: 3231 3266 2d7b 5f5f 5725 2e2a 413c 3162 212f-{__W%.*A<1b
0000030: 2b7d 7169 2a2d 343d +}qi*-4=
Пояснення
Сходи Möbius - це в основному драбина з двома додатковими кромками. Враховуючи обмежений ліс на сходах, його можна підняти на 1–4 ліси з обмеженим доступом на сходах Мебіуса. Краї можна додати за умови, що не створюється вершина ступеня 3 або циклу. Ступені чотирьох кутів та їх взаємозв'язок утворюють 116 класів лісу з обмеженими можливостями на сходах, хоча деякі з них рівноцінні через симетрії прямокутника. Я написав програму для аналізу розширень сходів довжиною n до однієї довжини n + 1, а потім об'єднав класи в 26 класів еквівалентності. Це дає закриту форму
⎡⎣⎢⎢⎢1111⎤⎦⎥⎥⎥T⎡⎣⎢⎢⎢1120223021410110⎤⎦⎥⎥⎥n−2⎡⎣⎢⎢⎢0100⎤⎦⎥⎥⎥+
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢221111122⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥T⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢210001030100001020112100120100010011101100010110000020100000010110001140100011122⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥n−2⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢002200000⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥+
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢1244113222344⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥T⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢0001001000000021001011000200200002000031004001002000011000001000100100000000010003002002000001000010000200101000000110002001001000101020000012100101101000220010010200004⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥n−2⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢1011201000121⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
тому значення можна швидко обчислити, взявши три лінійні повторення, а потім додавши їх, але це не дуже вибагливо.
Однак якщо взяти невідводячі множники різних характерних многочленів і множимо разом один з кожного (ігноруючи кратність), ми отримаємо многочлен ступеня 10, який дає робочий єдиний лінійний повтор.
Конструктивний підхід (58 символів)
qi:Q2*,Wa*e!{Wa/{_W%e<}%$}%_&{{,1>},2few:~{:-z(Q(%}%0-!},,
Інтернет демо . Він працюватиме в Інтернеті n=2
без проблем і n=3
з трохи терпіння. Адже n=1
це збій, але оскільки ОП вирішила виключити цю справу з вимог, це не є принциповою проблемою.
Розсічення
qi:Q e# Take input from stdin, parse to int, store in Q
2*,Wa*e! e# Take all permutations of (0, -1, 1, -1, 2, -1, ..., -1, 2*Q-1)
{ e# Map to canonical form...
Wa/ e# Split around the -1s
{_W%e<}% e# Reverse paths where necessary to get a canonical form
$ e# Sort paths
}%
_& e# Filter to distinct path sets
{ e# Filter to path sets with valid paths:
{,1>}, e# Ignore paths with fewer than two elements (can't be invalid; break 2ew)
2few:~ e# Break paths into their edges
{:-z(Q(%}% e# The difference between the endpoints of an edge should be +/-1 or Q (mod 2Q)
e# So their absolute values should be 1, Q, 2Q-1.
e# d => (abs(d)-1) % (Q-1) maps those differences, and no other possible ones, to 0
e# NB {:-zQ(%}% to map them all to 1 would save a byte, but wouldn't work for Q=2
0-! e# Test that all values obtained are 0
},
, e# Count the filtered distinct path sets
Більш ефективна версія займає 98 байт:
qi2*:Q{a{__0=[1Q2/Q(]f+Qf%_&1$-\f{+E}~}:E~}/]{_W%>!},:MW=0{_{M\f{__3$_@&@:e<@|^{=}{^j}?}1b}{,)}?}j
Демонстрація в Інтернеті
Це будує можливі шляхи шляхом першого глибинного пошуку, а потім використовує функцію запам'ятовування, яка підраховує можливі ліси з обмеженням для заданого набору вершин. Функція працює рекурсивно, виходячи з того, що будь-який обмежений ліс для заданого непустого набору вершин складається з шляху, що містить найменшу вершину, і лісу з обмеженими можливостями, що охоплює вершини, які не знаходяться на цьому шляху.
34, 241, 1582, 10204, 65197, 415076, 2638366, 16759249, 106427154, 675771276, 4290678337
. Я не впевнений, чому введення даних1
також не потрібно з результатом2
.