Скажімо, у вас 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.5
50%. - Ваш код теоретично повинен обробляти будь-яке невід’ємне ціле число
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
Повідомте мене, якщо у вас є якісь питання або пропозиції. Успіхів і хорошої оптимізації!