Bot bêbado educado e míope em um campo minado


11

Como o título pode sugerir, esse problema é semi-inspirado no educado bot bêbado míope de @NP

Nosso pobre bot é colocado em uma grade cartesiana na origem e, a cada minuto, move 1 unidade em uma das quatro direções (Cima, Baixo, Esquerda, Direita).

Após n minutos, todas as minas latentes na grade são ativadas, matando qualquer bot pobre que possa se encontrar sobre elas. As minas estão localizadas em todas as coordenadas inteiras que satisfazem a equação | y | = | x |.

Desafio

Você receberá n , o número de minutos antes da explosão das minas, como entrada e como saída, você deve encontrar a probabilidade de que o bot esteja morto .

Entrada : um número natural que representa n .

Saída : deixe que a probabilidade de o bot estar morto seja p / q, onde p e q são números inteiros relativamente primos (q não pode ser 0, mas p pode). Saída p.

Regras

  • Seu algoritmo não deve ser executado em tempo exponencial ou superior. Idealmente, ele deve ser executado em tempo polinomial ou menos.
  • Seu algoritmo deve ser capaz de lidar com entradas n<20 (pode ser ajustado se for muito difícil) em um tempo razoável.
  • Este é um desafio do .
  • A iteração de todas as possibilidades para um dado n definitivamente não será aceita como resposta.

Casos de teste

1->0

2->3

4->39

6->135

8->7735

10->28287

Exemplo de cálculo para n = 6

Temos quatro movimentos possíveis: U, D, R e L. O número total de caminhos que podem ser seguidos é 4 ^ 6 ou 4096. Há 4 casos possíveis que chegam ao longo da linha y = x: x, y = ± 1; x, y = ± 2; x, y = ± 3; ou x = y = 0. Contaremos o número de maneiras de terminar em (1,1), (2,2) e (3,3), multiplicá-las por 4 para dar conta dos outros quadrantes e adicionar isso para o número de maneiras de terminar em (0,0).

Caso 1: O bot termina em (3, 3). Para que o bot acabe aqui, ele deve ter tido três movimentos certos e três movimentos para cima. Em outras palavras, o número total de maneiras de chegar aqui são as maneiras de reorganizar as letras na sequência RRRUUU, que é 6, escolha 3 = 20.

Caso 2: O bot termina em (2,2). Para que o bot acabasse aqui, ele poderia ter 2 jogadas para cima, 3 para a direita e 1 para a esquerda; ou 2 movimentos à direita, 3 movimentos para cima e 1 movimento para baixo. Assim, o número total de maneiras de chegar aqui é a soma das maneiras de reorganizar as letras nas seqüências RRRLUU e UUUDRR, ambas as quais são (6 escolha 1) * (5 escolha 2) = 60, para um total de 120 possibilidades .

Caso 3: O bot termina em (1,1). Para que o bot acabasse aqui, ele poderia ter: 1 movimento à direita, 3 movimentos para cima e 2 movimentos para baixo. Nesse caso, o número de maneiras de reorganizar as letras na sequência RUUUDD é (6, escolha 1) * (5, escolha 2) = 60.

1 movimento para cima, 3 movimentos para a direita e 2 movimentos para a esquerda. Nesse caso, o número de maneiras de reorganizar as letras na sequência URRRLL é (6, escolha 1) * (5, escolha 2) = 60.

2 movimentos à direita, 1 movimento à esquerda, 2 movimentos para cima e 1 movimento para baixo. Nesse caso, o número de maneiras de reorganizar as letras na sequência UUDRRL é (6, escolha 1) * (5, escolha 1) * (4, escolha 2) = 180.

Assim, o número total de maneiras de terminar em (1,1) é 300.

Caso 4: O bot termina em (0,0). Para que o bot acabasse aqui, ele poderia ter:

3 movimentos à direita e 3 movimentos à esquerda. Nesse caso, o número de maneiras de reorganizar as letras na sequência RRRLLL é (6, escolha 3) = 20.

3 movimentos para cima e 3 movimentos para baixo. Nesse caso, o número de maneiras de reorganizar as letras na sequência UUUDDD é (6, escolha 3) = 20.

1 movimento para a direita, 1 movimento para a esquerda, 2 movimentos para cima e 2 movimentos para baixo. Nesse caso, o número de maneiras de reorganizar as letras na sequência RLUUDD é (6, escolha 1) * (5, escolha 1) * (4, escolha 2) = 180.

1 movimento para cima, 1 movimento para baixo, 2 movimentos para a direita e 2 movimentos para a esquerda. Nesse caso, o número de maneiras de reorganizar as letras na sequência RRLLUD é (6, escolha 1) * (5, escolha 1) * (4, escolha 2) = 180.

Assim, o número total de maneiras de terminar em (0,0) é 400.

Adicionando esses casos, obtemos o número total de maneiras de terminar em | y | = | x | é 4 (20 + 120 + 300) + 400 = 2160. Assim, nossa probabilidade é 2160/4096. Quando essa fração é totalmente reduzida, é 135/256, então nossa resposta é 135 .


Eu gosto do desafio, mas acho que ele se beneficiaria da inclusão de um exemplo trabalhado para um dos casos de teste muito pequenos (2 ou 3), por exemplo.
Mr. Xcoder

@ Mr.Xcoder Vou adicionar um quando tiver tempo.
Don Thousand

2
Desafio interessante. Observe que usar a palavra "idealmente" em uma regra não a torna uma regra. Seria útil dizer definitivamente de uma maneira ou de outra.
precisa saber é o seguinte

1
Mas ninguém fala sobre o algoritmo de aprendizado da primeira geração?
RedWolf Programas

1
@RedwolfPrograms ahaha sim, mas esse bot tem o nome mais legal #
Don Thousand

Respostas:


17

Python 2 , 65 bytes

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

Experimente online!

A probabilidade de o bot estar morto pode ser expressa como:

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

e o binômio é entendido como quando não é inteiro.0n/2

Podemos raciocinar assim. Qual é a probabilidade de o bot pousar na linha ? Isso acontece se o número total de movimentos para cima e para a esquerda for igual ao número total de movimentos para baixo e para a direita. É a mesma probabilidade de que, digamos, você jogue uma moeda vezes e obtenha o máximo de coroas que as cabeças. Você deve escolher flips para ser o cabeçalho de flips, o que pode ser feito de , de sequências possíveis no geral, fornecendo probabilidadey=xnn/2n(nn/2)2n

s=12n(nn/2)

A probabilidade de aterrar na linha também é . Portanto, a probabilidade de aterrissagem em qualquer das linhas é a soma destes ou , exceto que estamos contando duas vezes a probabilidade de aterrissagem de nas duas linhas e devemos subtraí-la para compensar.y=xs2sx=y=0

Acontece que a probabilidade de aterrissar em é apenas , o produto da probabilidade de aterrissar em cada linha. Podemos argumentar que os eventos são independentes da seguinte forma: se escolhermos uma sequência aleatória de números iguais de "Cima ou Esquerda" e "Baixo ou Direita" para pousar em e da mesma forma com "Cima ou Direita" e "Baixo ou Esquerda "para , podemos combiná-los exclusivamente em uma sequência de Cima, Baixo, Esquerda, Direita, fazendo a interseção dos pares de direções em cada posição.x=y=0s2x=yx=y

Portanto, a probabilidade de aterrar em ou é .x=yx=y2ss2

O código calcula o binomial usando esta expressão como na base . Para extrair o numerador da fração de probabilidade, observamos que o denominador é uma potência de 2, portanto usamos a expressão para dividir a potência máxima de 2 , expressa como o truque de bits clássico .(nn/2)(b+1)**n/b**(n/2)%bb=2**nr/(r&-r)rr&-r

A solução é resolvida escrevendo como para que seja referenciado apenas uma vez e trabalhando sem as frações de para permanecer dentro dos números inteiros. A computação é de tempo polinomial em mesmo com a maneira divertida de calcular binômios.2ss21(1s)2s1/2nn


Depois de escrever a prova da probabilidade do bot morrer, encontrei uma maneira possivelmente mais limpa de provar e apresentá-lo.

Vamos faixa de manter os valores de e após cada movimento do bot. Cada uma das quatro direcções, para cima, para baixo, para a esquerda e para a direita, quer aumenta ou diminui cada de e , com as quatro direcções correspondentes aos quatro combinações.a=x+yb=xyab

Assim, um movimento aleatório é equivalente a adicionar aleatoriamente de e independentemente a . Isso é equivalente a fazer caminhadas aleatórias separadas em e .a ± 1 b a b±1a±1bab

Agora, o robô termina na linha ou exatamente quando ou . Portanto, a probabilidade de terminar com é e da mesma forma para . Uma vez que as esferas são independentes, a probabilidade de que e é , de modo que a probabilidade de que pelo menos um é zero é o complemento de .x = - y a = 0 b = 0 a = 0 s = 1x=yx=ya=0b=0a=0 b=0a0b0(1-s)21-(1-s)2s=12n(nn/2)b=0a0b0(1s)21(1s)2


3
Fantástico! Eu estava esperando alguém derivar isso. Eu não imaginava que fosse tão rápido. A desvantagem agora é que a maioria das outras respostas não precisará pensar muito :(. Excelente +1
Don Thousand

aproveite a pequena recompensa (não tem muito o que pedir muito)
Don Thousand

1
@RushabhMehta Obrigado, isso é muito gentil da sua parte! Sua recompensa me motivou a escrever uma prova mais limpa em que pensei depois.
xnor

A verdadeira inspiração para esse problema foi o problema 11 do AIME I 2014, se você quiser conferir.
Don Thousand
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.