พื้นหลัง
ครั้งที่แล้วเรานับกลุ่มของขนาดที่กำหนดซึ่งเป็นปัญหาที่ไม่สำคัญ
เวลานี้เราจะนับเฉพาะกลุ่มชาว Abelianเช่นกลุ่มที่มีการดำเนินการสับเปลี่ยน อย่างเป็นทางการเป็นกลุ่ม(G, *)เป็นคริสต์ถ้าx * y ที่ y = x *สำหรับทุกx, yในG
ปัญหานี้ง่ายขึ้นมากดังนั้นเราจะนับพวกมันอย่างมีประสิทธิภาพ
งาน
เขียนโปรแกรมหรือฟังก์ชั่นที่ยอมรับจำนวนเต็มไม่เป็นลบnเป็น input และพิมพ์หรือส่งกลับจำนวนของกลุ่มคริสต์ไม่ใช่ isomorphic ของการสั่งซื้อn
วิธีหนึ่งในการคำนวณจำนวนกลุ่ม - ซึ่งเราจะแสดงโดยA (n) - คือการสังเกตสิ่งต่อไปนี้:
A (0) = 0
ถ้าหน้าเป็นนายก(หน้าk )จะเท่ากับจำนวนของพาร์ทิชันจำนวนเต็มของk (cfr. OEIS A000041 )
ถ้าn = mkและมและkจะร่วมนายกA (n) = A (เมตร) A (k)
คุณอาจจะใช้นี้หรือวิธีการอื่นใดในการคำนวณA (n)
กรณีทดสอบ
Input Output
0 0
1 1
2 1
3 1
4 2
5 1
6 1
7 1
8 3
9 2
10 1
11 1
12 2
13 1
14 1
15 1
16 5
17 1
18 2
19 1
20 2
4611686018427387904 1300156
5587736968198167552 155232
9223371994482243049 2
(นำมาจากOEIS A000688 )
กฎเพิ่มเติม
เมื่อให้เวลา RAM และขนาดการลงทะเบียนที่สามารถเก็บอินพุตได้รหัสของคุณควรใช้งานได้ (ตามทฤษฎี) สำหรับจำนวนเต็มขนาดใหญ่โดยพลการ
รหัสของคุณจะต้องทำงานกับจำนวนเต็มทั้งหมดระหว่าง0ถึง2 63 - 1และเสร็จสิ้นภายใน 10 นาทีบนเครื่องของฉัน (Intel i7-3770, 16 GiB RAM, Fedora 21)
โปรดตรวจสอบให้แน่ใจว่าคุณได้กำหนดรหัสสำหรับกรณีทดสอบสามครั้งล่าสุดก่อนส่งคำตอบ
บิวด์อินที่
FiniteAbelianGroupCount
ไม่ได้รับอนุญาตให้ทำภารกิจนี้เช่น Mathematicaบิวด์อินที่ไม่อนุญาตให้ส่งคืนหรือนับพาร์ติชันจำนวนเต็มของตัวเลขหรือพาร์ติชันของรายการ
ใช้กฎมาตรฐานของกอล์ฟ