मान लीजिए कि आपके पास 20-पक्षीय मरना है। आप उस मर को रोल करना शुरू करते हैं और इसे अंत में सभी 20 मूल्यों को रोल करने से पहले कुछ दर्जन बार रोल करना पड़ता है। आपको आश्चर्य है, मुझे सभी 20 मूल्यों को देखने का 50% मौका मिलने से पहले कितने रोल चाहिए? और n
सभी n
पक्षों को रोल करने से पहले मुझे मरने वाले रोल के कितने रोल चाहिए ?
कुछ शोध के बाद, आपको पता चलता है कि रोल के बाद सभी मानों को रोल करने की संभावना की गणना के लिए एक सूत्र मौजूद है ।n
r
P(r, n) = n! * S(r, n) / n**r
जहाँ दूसरी तरह की स्टर्लिंग संख्याओं कोS(a, b)
निरूपित किया जाता है , n वस्तुओं के एक सेट (प्रत्येक रोल) को गैर-रिक्त उपसमूह (प्रत्येक पक्ष) में विभाजित करने के तरीकों की संख्या।
आपको OEIS अनुक्रम भी मिलता है , जिसे हम कॉल करेंगे, जो R(n)
कि सबसे छोटे से मेल खाता है r
जहां P(r, n)
कम से कम 50% है। n
इस क्रम के वें कार्यकाल की गणना जितनी जल्दी हो सके, चुनौती है ।
चुनौती
- एक को देखते हुए
n
, उस छोटी को खोजेंr
जहां 50%P(r, n)
से अधिक या उससे अधिक है0.5
। - आपके कोड को सैद्धांतिक
n
रूप से इनपुट के रूप में किसी भी गैर-नकारात्मक पूर्णांक को संभालना चाहिए , लेकिन हम केवल आपके कोड का परीक्षण रेंज में करेंगे1 <= n <= 1000000
। - स्कोरिंग के लिए, हम हो जाएगा कुल समय चलाने के लिए आवश्यक ले
R(n)
इनपुट पर1
के माध्यम से10000
। - हम यह जांचेंगे कि क्या आपके समाधान
R(n)
आपके आउटपुट पर हमारे संस्करण को चलाने के लिए सही हैं या नहीं ,P(your_output, n) >= 0.5
और यह देखने के लिएP(your_output - 1, n) < 0.5
कि आपका आउटपुट वास्तव मेंr
किसी के लिए सबसे छोटा हैn
। - आप
S(a, b)
अपने समाधान के लिए किसी भी परिभाषा का उपयोग कर सकते हैं। विकिपीडिया की कई परिभाषाएँ हैं जो यहाँ सहायक हो सकती हैं। - आप अपने समाधानों में बिल्ट-इन का उपयोग कर सकते हैं, जिसमें गणना
S(a, b)
करने वाले याP(r, n)
सीधे गणना करने वाले लोग भी शामिल हैं। - आप 1000 मान तक
R(n)
और एक लाख स्टर्लिंग संख्या तक हार्डकोड कर सकते हैं , हालांकि इनमें से कोई भी हार्ड सीमा नहीं है, और यदि आप उन्हें बढ़ाने या कम करने के लिए एक ठोस तर्क दे सकते हैं, तो उन्हें बदला जा सकता है। - आप हर संभव जांच करने की जरूरत नहीं है
r
के बीचn
औरr
हम के लिए देख रहे हैं, लेकिन आप छोटी से छोटी खोजने के लिए की जरूरत करनाr
और बस किसी भी नहींr
है, जहांP(r, n) >= 0.5
। - आपके प्रोग्राम को ऐसी भाषा का उपयोग करना चाहिए जो विंडोज 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
यदि आपके कोई प्रश्न या सुझाव हैं तो मुझे बताएं। सौभाग्य और अच्छा अनुकूलन!