Скажімо, у вас 20-стороння штамповка. Ви починаєте котити, що гине, і вам доведеться прокатати її кілька десятків разів, перш ніж ви нарешті згорнете всі 20 значень. Вам цікаво, скільки рулонів мені потрібно, перш ніж я отримаю 50% шанс побачити всі 20 значень? І скільки рулонів стороннього nштампу мені потрібно закатати, перш ніж прокатати всі nсторони?
Після деяких досліджень ви дізнаєтесь, що існує формула для обчислення ймовірності прокрутки всіх nзначень після rрулонів.
P(r, n) = n! * S(r, n) / n**r
де S(a, b)позначає номери Стірлінга другого роду , кількість способів розділити набір з n об’єктів (кожен рулон) на k непусті підмножини (кожна сторона).
Ви також знаходите послідовність OEIS , яку ми будемо називати R(n), що відповідає найменшій, rде P(r, n)принаймні 50%. Завдання полягає в тому, щоб обчислити nтретій термін цієї послідовності якомога швидше.
Змагання
- З огляду на
n, знайдіть найменше,rдеP(r, n)більше або дорівнює0.550%. - Ваш код теоретично повинен обробляти будь-яке невід’ємне ціле число
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. - Ваша програма повинна використовувати мову, яку вільно можна керувати в Windows 10.
Характеристики комп'ютера, який перевірятиме ваші рішення, є i7 4790k, 8 GB RAM. Дякуємо @DJMcMayhem за надання свого комп’ютера для тестування. Не соромтеся додавати свої неофіційні терміни для довідок, але офіційний термін буде наданий пізніше, коли DJ зможе його протестувати.
Тестові справи
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
Повідомте мене, якщо у вас є якісь питання або пропозиції. Успіхів і хорошої оптимізації!