Ввічливий недалекоглядний п’яний бот на мінному полі


11

Як видно з назви можна припустити, ця проблема частково навіяно ввічливі короткозорий Drunk Bot по @NP

Наш бідний бот розміщений на декартовій сітці біля початку, і через кожну хвилину він рухається по 1 одиниці в одному з чотирьох напрямків (вгору, вниз, вліво, вправо).

Через п’ять хвилин усі приховані міни в сітці активізуються, вбиваючи будь-якого бідного бота, який може опинитися над ними. Шахти розташовані на всіх цілих координатах, що задовольняють рівнянню | y | = | x |.

Виклик

Вам буде надано n , кількість хвилин до вибуху мін, як вхід, так і як вихід, ви повинні знайти ймовірність того, що бот загинув .

Введення : Натуральне число, що представляє n .

Вихід : Нехай ймовірність того, що бот загинув, буде p / q, де p і q є відносно простими цілими числами (q не може бути 0, але p може). Вихід p.

Правила

  • Ваш алгоритм не повинен працювати в експоненціальний або більш високий час. Він в ідеалі повинен працювати в поліноміальний час або менше.
  • Ваш алгоритм повинен вміти обробляти введення n<20 (може бути відрегульовано, якщо занадто важко) за розумний час.
  • Це проблема з .
  • Ітерація над усіма можливостями для даної російської мови , безумовно, не буде прийнята як відповідь.

Випробування

1->0

2->3

4->39

6->135

8->7735

10->28287

Приклад Розрахунок для n = 6

У нас є 4 можливі рухи: U, D, R та L. Загальна кількість шляхів, які можна було пройти, дорівнює 4 ^ 6, або 4096. Існують 4 можливі випадки, які приземляються уздовж лінії y = x: x, y = ± 1; x, y = ± 2; x, y = ± 3; або x = y = 0. Ми підрахуємо кількість способів закінчення (1,1), (2,2) та (3,3), помножимо їх на 4 для врахування інших квадрантів і додамо це до кількості способів закінчити (0,0).

Випадок 1: Бот закінчується на (3, 3). Для того, щоб бот опинився тут, у нього повинно було бути 3 правильних ходу та 3 вгору. Іншими словами, загальна кількість способів потрапити сюди - це способи переставити літери в послідовності RRRUUU, яка 6 вибирає 3 = 20.

Випадок 2: Бот закінчується на (2,2). Для того, щоб бот опинився тут, у нього могли бути 2 ходи вгору, 3 праворуч і 1 лівий хід; або 2 правильних рухи, 3 вгору і 1 рух вниз. Таким чином, загальна кількість способів потрапити сюди - це сума способів переставити літери в послідовностях RRRLUU та UUUDRR, обидва з яких (6 вибирають 1) * (5 вибирають 2) = 60, загалом 120 можливостей .

Випадок 3: Бот закінчується на рівні (1,1). Для того, щоб бот опинився тут, у нього могли бути: 1 правильний хід, 3 вгору та 2 вниз. У цьому випадку кількість способів переставити літери в послідовності RUUUDD дорівнює (6 виберіть 1) * (5 виберіть 2) = 60.

1 рух вгору, 3 праворуч і 2 лівих. У цьому випадку кількість способів переставити літери в послідовності URRRLL дорівнює (6 виберіть 1) * (5 виберіть 2) = 60.

2 праворухи, 1 лівий хід, 2 вгору та 1 рух вниз. У цьому випадку кількість способів переставити літери в послідовності UUDRRL дорівнює (6 виберіть 1) * (5 виберіть 1) * (4 виберіть 2) = 180.

Таким чином, загальна кількість способів закінчити (1,1) становить 300.

Випадок 4: Бот закінчується на (0,0). Для того, щоб бот опинився тут, він міг мати:

3 правих та 3 лівих. У цьому випадку кількість способів переставити літери в послідовності RRRLLL дорівнює (6 виберіть 3) = 20.

3 вгору і 3 вниз. У цьому випадку кількість способів переставити літери в послідовності UUUDDD становить (6 виберіть 3) = 20.

1 правий хід, 1 хід вліво, 2 вгору і 2 вниз. У цьому випадку кількість способів переставити літери в послідовності RLUUDD дорівнює (6 виберіть 1) * (5 виберіть 1) * (4 виберіть 2) = 180.

1 рух вгору, 1 рух вниз, 2 праворуч і 2 руху вліво. У цьому випадку кількість способів переставити літери в послідовності RRLLUD становить (6 вибираємо 1) * (5 вибираємо 1) * (4 вибираємо 2) = 180.

Таким чином, загальна кількість способів закінчити (0,0) дорівнює 400.

Якщо скласти ці випадки разом, ми отримаємо, що загальна кількість способів опинитися на | y | = | х | дорівнює 4 (20 + 120 + 300) + 400 = 2160. Отже, наша ймовірність дорівнює 2160/4096. Коли ця частка повністю зменшена, вона становить 135/256, тому наша відповідь - 135 .


Мені подобається виклик, але я думаю, що було б корисно включити відпрацьований приклад для одного з дуже малих тестових випадків (2 або 3), наприклад.
Містер Xcoder

@ Mr.Xcoder Я додам його, коли матиму час.
Дон Тисяча

2
Цікавий виклик. Зауважте, що використання слова "в ідеалі" у правилі робить його не правилом. Було б корисно сказати точно так чи інакше.
трихоплакс

1
Але про алгоритм навчання першого класу ніхто не говорить?
Програми Redwolf

1
@RedwolfPrograms ahaha yea, але цей бот має крутішу назву
Don Thousand

Відповіді:


17

Python 2 , 65 байт

def p(n):b=2**n;r=b*b-((~b)**n/b**(n/2)%-b)**2;print~n%2*r/(r&-r)

Спробуйте в Інтернеті!

Ймовірність того, що бот помер, можна виразити так:

f(n)=2ss2, where s=12n(nn/2)

і двочлен вважається рівним коли не є цілим.0n/2

Ми можемо так міркувати. Яка ймовірність того, що бот приземлиться на лінії ? Це відбувається, якщо загальна кількість рухів вгору та вліво дорівнює загальній кількості рухів вниз і вправо. Це така ж ймовірність, що, скажімо, ви перевернете монету разів і отримаєте стільки хвостів, скільки голів. Ви повинні вибрати переворотів, щоб бути головами переворотів, що може бути зроблено способами з можливих послідовностей загалом, що дає ймовірністьy=xnn/2n(nn/2)2n

s=12n(nn/2)

Ймовірність посадки лінії також . Отже, ймовірність посадки в будь-який рядок є сумою цих або , за винятком того, що ми вдвічі рахуємо ймовірність висадки в обох рядках, і треба відняти його для компенсації.y=xs2sx=y=0

Виявляється, ймовірність посадки на просто , добуток ймовірності посадки на кожен рядок. Ми можемо стверджувати, що події є незалежними так: якщо ми виберемо випадкову послідовність рівних чисел "Вгору або Вліво" і "Вниз або Вправо", щоб приземлитися на а також "Вгору або Вправо" і "Вниз або Вліво" "для , ми можемо однозначно об'єднати їх у послідовність" Вгору "," Вниз "," Вліво "," Вправо ", взявши перетин пар напрямків у кожній позиції.x=y=0s2x=yx=y

Отже, ймовірність посадки на або дорівнює .x=yx=y2ss2

Код обчислює двочлен використовуючи цей вираз, як і в основі . Щоб дістати чисельник з частки ймовірності, зазначимо, що знаменник є силою 2, тому ми використовуємо вираз для поділу максимальної сили 2 , вираженої як класичний бітовий трюк .(nn/2)(b+1)**n/b**(n/2)%bb=2**nr/(r&-r)rr&-r

Рішення гольфується, записуючи як так що посилається лише один раз, і працює без дробів, щоб залишатися в цілих числах. Обчислення є многочленами в навіть при химерному способі обчислення біноміалів.2ss21(1s)2s1/2nn


Написавши підтвердження ймовірності того, що бот помирає, я знайшов можливо більш чистий спосіб довести це і викласти його.

Відстежимо значення та після кожного переміщення бота. Кожен з чотирьох напрямків вгору, вниз, вліво і вправо або з кроком, або зменшенням кожного з і , причому чотири напрямки відповідають чотирьом комбінаціям.a=x+yb=xyab

Отже, випадковий хід еквівалентний випадковому додаванню до і незалежно до . Це рівнозначно окремим випадковим прогулянкам по і .±1a±1bab

Тепер робота закінчується на лінії або саме тоді, коли або . Отже, ймовірність закінчення дорівнює і аналогічно . Оскільки прогулянки незалежні, ймовірність того, що і дорівнює , то ймовірність того, що принаймні один дорівнює нулю, є доповненням .x=yx=ya=0b=0a=0 b=0a0b0(1-s)21-(1-s)2s=12n(nn/2)b=0a0b0(1s)21(1s)2


3
Фантастичний! Я чекав, коли хтось це виведе. Я не уявляв, що це так швидко. Недоліком зараз є те, що на більшість інших відповідей не доведеться думати занадто багато :(. Відмінно +1
Дон Тисяча

насолоджуйтесь невеликою щедротою (не так багато, щоб так шкодувати)
Дон тисячі

1
@RushabhMehta Дякую, це дуже мило з вас! Ваша щедрість мотивувала мене написати чистіші докази, про які я думав згодом.
xnor

Справжнім натхненням для цієї проблеми стала проблема AIME I 2014 11, якщо ви хочете її перевірити.
Дон тисячі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.