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 บนบันไดMöbius สามารถเพิ่มขอบได้หากไม่ได้สร้างจุดสุดยอดของระดับ 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
เกิดปัญหา แต่ตั้งแต่ OP ได้เลือกที่จะไม่รวมกรณีที่ว่าจากความต้องการก็ไม่ได้เป็นปัญหาพื้นฐาน
การผ่า
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
2-12: ฉันไม่แน่ใจว่าทำไมการป้อนข้อมูลจะยังไม่จำเป็นต้องใช้กับการส่งออก1
2