CJam ( 58 56 문자)
일부 문자는 인쇄 할 수 없으며 하나는 StackExchange 소프트웨어에 의해 엉망이되는 탭입니다.
"¶3¬î¿Á· 7ÛÈmÈÚÚ¡"256b454b212f-{__W%.*A<1b+}qi*-4=
온라인 데모 . 약 3 초 안에 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 사다리는 기본적으로 두 개의 추가 모서리가있는 사다리입니다. 사다리에 제한된 숲이 있으면 Möbius 사다리에있는 1에서 4 개의 제한된 숲으로 들어 올릴 수 있습니다. 3 도의 정점 또는주기를 생성하지 않는 경우 모서리를 추가 할 수 있습니다. 네 모서리의 각도와 그 상호 연결은 사다리에 116 클래스의 제한된 숲을 형성하지만 그 중 일부는 사각형의 대칭으로 인해 동일합니다. 나는 길이가 n 인 사다리의 길이를 길이가 n + 1 인 확장으로 분석하는 프로그램을 작성한 다음 클래스를 26 개의 등가 클래스로 병합했습니다. 이것은 닫힌 형태를 제공합니다
⎡⎣⎢⎢⎢1111⎤⎦⎥⎥⎥티⎡⎣⎢⎢⎢112022삼021410110⎤⎦⎥⎥⎥n - 2⎡⎣⎢⎢⎢0100⎤⎦⎥⎥⎥+
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢221111122⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥티⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢2100010삼0100001020112100120100010011101100010110000020100000010110001140100011122⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥n - 2⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢002200000⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥+
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢124411삼222삼44⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥티⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢00010010000000210010110002002000020000삼100400100200001100000100010010000000001000삼002002000001000010000200101000000110002001001000101020000012100101101000220010010200004⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥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
output과 함께 input 이 왜 필요 하지 않은지 잘 모르겠습니다2
.