สมมติว่าคุณมีคนตาย 20 ด้าน คุณเริ่มหมุนแม่พิมพ์นั้นและต้องหมุนสองสามครั้งก่อนที่คุณจะหมุนค่าทั้งหมด 20 คุณสงสัยว่าฉันต้องม้วนจำนวนเท่าไรก่อนที่ฉันจะได้รับโอกาส 50% ในการเห็นค่าทั้งหมด 20 ตัว และnฉันต้องม้วนตายกี่ม้วนก่อนจะกลิ้งทุกnด้าน?
หลังจากการวิจัยบางอย่างคุณพบว่ามีสูตรสำหรับการคำนวณโอกาสในการหมุนnค่าทั้งหมดหลังจากrม้วน
P(r, n) = n! * S(r, n) / n**r
โดยที่S(a, b)หมายถึงตัวเลข Stirling ของชนิดที่สองจำนวนวิธีที่จะแบ่งพาร์ติชันชุดของวัตถุ n (แต่ละม้วน) เป็น k ย่อยที่ไม่ว่างเปล่า (แต่ละด้าน)
คุณยังพบลำดับ OEISที่เราจะเรียกR(n)ซึ่งสอดคล้องกับลำดับที่เล็กที่สุดrที่P(r, n)อย่างน้อย 50% ความท้าทายคือการคำนวณnคำที่ลำดับของลำดับนี้โดยเร็วที่สุด
ความท้าทาย
- ได้รับ
nหาที่เล็กที่สุดrที่P(r, n)มากกว่าหรือเท่ากับ0.5หรือ 50% - รหัสของคุณในทางทฤษฎีควรจะจัดการกับจำนวนเต็มไม่เป็นลบ
nเป็น input1 <= n <= 1000000แต่เราจะได้รับการทดสอบรหัสของคุณในช่วงของ - สำหรับการให้คะแนนเราจะใช้เวลาทั้งหมดที่จำเป็นในการทำงาน
R(n)เกี่ยวกับปัจจัยการผลิตผ่าน110000 - เราจะตรวจสอบว่าการแก้ปัญหาของคุณถูกต้องโดยใช้รุ่นของเรา
R(n)ในการส่งออกของคุณเพื่อดูว่าP(your_output, n) >= 0.5และP(your_output - 1, n) < 0.5เช่นว่าการส่งออกของคุณเป็นจริงที่เล็กที่สุดสำหรับที่กำหนดrn - คุณสามารถใช้คำจำกัดความใด ๆ
S(a, b)ในการแก้ปัญหาของคุณ Wikipediaมีคำจำกัดความหลายประการที่อาจเป็นประโยชน์ที่นี่ - คุณสามารถใช้บิวด์อินในโซลูชันรวมถึงที่คำนวณ
S(a, b)หรือแม้แต่ที่คำนวณP(r, n)โดยตรง - คุณสามารถฮาร์โค้ดได้สูงสุด 1,000 ค่า
R(n)และหนึ่งล้านสเตอร์ลิงแม้ว่าจะไม่มีขีด จำกัด เหล่านี้และสามารถเปลี่ยนแปลงได้หากคุณสามารถโต้แย้งเพื่อโน้มน้าวหรือลดระดับ - คุณไม่จำเป็นต้องตรวจสอบเป็นไปได้ทุก
rระหว่างnและrเรากำลังมองหา แต่คุณไม่จำเป็นที่จะหาที่เล็กที่สุดrและไม่เพียงใดที่rP(r, n) >= 0.5 - โปรแกรมของคุณต้องใช้ภาษาที่รันได้อย่างอิสระบน Windows 10
i7 4790k, 8 GB RAMข้อกำหนดของคอมพิวเตอร์ที่จะทดสอบการแก้ปัญหาของคุณ ขอบคุณ@DJMcMayhem ที่ให้คอมพิวเตอร์ของเขาสำหรับการทดสอบ อย่าลังเลที่จะเพิ่มเวลาที่ไม่เป็นทางการของคุณเองสำหรับการอ้างอิง แต่จะมีการกำหนดเวลาอย่างเป็นทางการในภายหลังเมื่อดีเจสามารถทดสอบได้
กรณีทดสอบ
n R(n)
1 1
2 2
3 5
4 7
5 10
6 13
20 67 # our 20-sided die
52 225 # how many cards from a huge uniformly random pile until we get a full deck
100 497
366 2294 # number of people for to get 366 distinct birthdays
1000 7274
2000 15934
5000 44418
10000 95768
100000 1187943
1000000 14182022
แจ้งให้เราทราบหากคุณมีคำถามหรือข้อเสนอแนะ ขอให้โชคดีและการเพิ่มประสิทธิภาพที่ดี!