CJam ( 58 56 caracteres)
Algunos caracteres no pueden imprimirse, y uno es una pestaña que el software de StackExchange eliminará:
"¶3¬î¿Á· 7ÛÈmÈÚÚ¡"256b454b212f-{__W%.*A<1b+}qi*-4=
Demo en línea . Esto se ejecutará en línea durante n = 400 en aproximadamente tres segundos.
Codificado por 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=
Explicación
Una escalera de Möbius es básicamente una escalera con dos bordes adicionales. Dado un bosque restringido en una escalera, se puede levantar entre 1 y 4 bosques restringidos en la escalera de Möbius. Se pueden agregar los bordes siempre que no cree un vértice de grado 3 o un ciclo. Los grados de las cuatro esquinas y sus interconexiones forman 116 clases de bosque restringido en la escalera, aunque algunos de ellos son equivalentes debido a las simetrías del rectángulo. Escribí un programa para analizar las extensiones de una escalera de longitud n a una de longitud n + 1, y luego fusioné las clases en 26 clases de equivalencia. Esto da una forma cerrada
⎡⎣⎢⎢⎢1111⎤⎦⎥⎥⎥T⎡⎣⎢⎢⎢1120 02230 0214 410 0110 0⎤⎦⎥⎥⎥n - 2⎡⎣⎢⎢⎢0 010 00 0⎤⎦⎥⎥⎥+
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢221111122⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥T⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢210 00 00 010 030 010 00 00 00 010 020 011210 00 0120 010 00 00 010 00 01110 0110 00 00 010 0110 00 00 00 00 020 010 00 00 00 00 00 010 0110 00 00 0114 40 010 00 00 011122⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥n - 2⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢0 00 0220 00 00 00 00 0⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥+
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢124 44 411322234 44 4⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥T⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢0 00 00 010 00 010 00 00 00 00 00 00 0210 00 010 0110 00 00 020 00 020 00 00 00 020 00 00 00 0310 00 04 40 00 010 00 020 00 00 00 0110 00 00 00 00 010 00 00 010 00 010 00 00 00 00 00 00 00 00 010 00 00 030 00 020 00 020 00 00 00 00 010 00 00 00 010 00 00 00 020 00 010 010 00 00 00 00 00 0110 00 00 020 00 010 00 010 00 00 010 010 020 00 00 00 00 01210 00 010 0110 010 00 00 0220 00 010 00 010 020 00 00 00 04 4⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥n - 2⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢10 01120 010 00 00 0121⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
así que los valores se pueden calcular rápidamente tomando tres recurrencias lineales y luego agregándolas, pero esto no parece muy complejo.
Sin embargo, si tomamos los factores irreducibles de los diversos polinomios característicos y multiplicamos juntos uno de cada uno (ignorando la multiplicidad) obtenemos un polinomio de grado 10 que da una recurrencia lineal única que funciona.
Enfoque constructivo (58 caracteres)
qi:Q2*,Wa*e!{Wa/{_W%e<}%$}%_&{{,1>},2few:~{:-z(Q(%}%0-!},,
Demo en línea . Se ejecutará en línea n=2
sin problemas y n=3
con un poco de paciencia. Porque n=1
se bloquea, pero dado que OP ha elegido excluir ese caso de los requisitos, no es un problema fundamental.
Disección
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
Una versión más eficiente toma 98 bytes:
qi2*:Q{a{__0=[1Q2/Q(]f+Qf%_&1$-\f{+E}~}:E~}/]{_W%>!},:MW=0{_{M\f{__3$_@&@:e<@|^{=}{^j}?}1b}{,)}?}j
Demostración en línea
This builds the possible paths by depth-first search, then uses a memoised function which counts the possible restricted forests for a given set of vertices. The function works recursively on the basis that any restricted forest for a given non-empty set of vertices consists of a path containing the smallest vertex and a restricted forest covering the vertices not in that path.
34, 241, 1582, 10204, 65197, 415076, 2638366, 16759249, 106427154, 675771276, 4290678337
. No estoy seguro de por qué1
no se requiere entrada, con salida2
.