บทสรุปผู้บริหาร
ป้อนข้อมูลkให้ค้นหาพาร์ทิชันของจำนวนเต็ม1เพื่อnเป็นkส่วนย่อยฟรีสำหรับที่ใหญ่ที่สุดที่nคุณสามารถภายใน 10 นาที
พื้นหลัง: หมายเลข Schur
ชุดAคือผลรวมฟรีถ้าผลรวมของตนเองA + A = { x + y | x, y in A}มีองค์ประกอบที่ไม่มีในการร่วมกันกับมัน
สำหรับเลขจำนวนเต็มบวกทุกตัวkจะมีจำนวนเต็มที่มากที่สุดS(k)ซึ่งชุด{1, 2, ..., S(k)}นั้นสามารถแบ่งพาร์ติชันเป็นkเซ็ตย่อยที่ไม่มีผลรวมได้ หมายเลขนี้เรียกว่าหมายเลข k th Schur (OEIS A045652 )
ตัวอย่างเช่นS(2) = 4. เราสามารถแบ่งพาร์ติชัน{1, 2, 3, 4}เป็น{1, 4}, {2, 3}และนั่นคือพาร์ติชันที่ไม่ซ้ำกันในชุดย่อยที่ไม่มีผลรวมสองชุด แต่ตอนนี้เราไม่สามารถเพิ่ม5ส่วนใดส่วนหนึ่งได้
ท้าทาย
เขียนโปรแกรมกำหนดขึ้นซึ่งทำสิ่งต่อไปนี้:
- ใช้จำนวนเต็มบวก
kเป็นอินพุต - เขียนการประทับเวลา Unix ปัจจุบันเพื่อ stdout
- ขาออกลำดับของพาร์ทิชันของ
1การnเข้าไปในkส่วนย่อยรวมฟรีสำหรับเพิ่มขึ้นnตามลำดับด้วยเวลา Unix ปัจจุบันแต่ละ
ผู้ชนะจะได้เป็นโปรแกรมที่พิมพ์พาร์ทิชันสำหรับที่ใหญ่ที่สุดnภายใน 10 5นาทีในคอมพิวเตอร์ของฉันเมื่อได้รับการป้อนข้อมูล ความสัมพันธ์จะถูกแบ่งตามเวลาที่เร็วที่สุดเพื่อค้นหาพาร์ติชันสำหรับการnรันที่ใหญ่ที่สุดโดยเฉลี่ยมากกว่าสามการรันนั่นคือสาเหตุที่เอาต์พุตควรมีการประทับเวลา
รายละเอียดที่สำคัญ:
- ฉันมี Ubuntu ที่แม่นยำดังนั้นหากภาษาของคุณไม่รองรับฉันจะไม่สามารถให้คะแนนได้
- ฉันมีซีพียู Intel Core2 Quad ดังนั้นหากคุณต้องการใช้มัลติเธรดไม่ต้องใช้หัวข้อมากกว่า 4 เธรด
- หากคุณต้องการให้ฉันใช้ธงคอมไพเลอร์ใด ๆ หรือการใช้งานเอกสารที่ชัดเจนในคำตอบของคุณ
5คุณจะไม่กรณีพิเศษรหัสของคุณจะจัดการกับการป้อนข้อมูล- คุณไม่จำเป็นต้องแสดงผลการปรับปรุงทุกอย่างที่คุณพบ เช่นสำหรับการป้อนข้อมูลที่คุณสามารถส่งออกเพียงพาร์ทิชันสำหรับ
2n = 4แต่ถ้าคุณจะทำอะไรไม่ได้การส่งออกในช่วง 10n = 0นาทีแรกแล้วฉันจะทำประตูได้ว่าเป็น
n=59และการเรียงลำดับตามจำนวนที่ยิ่งใหญ่ที่สุดของตัวเลขที่ได้รับอนุญาตให้น้อยกว่าให้nextNn=64การเรียงลำดับตามความยาวของรายการหมายเลขที่ไม่อนุญาต (ซึ่งอาจมีซ้ำ) จะนำไปสู่n=30รูปแบบที่สวยงาม