Solução escrita por João Pedro
Conhecimento prévio necessário:
- Operações binárias em números
Chame de
a quantidade de bits ativos na representação binária de
. Agora, perceba que se
,
. Já que para cada bit ativo em
temos somente 1 bit ativo no total, e para cada bit desativado temos ou 2 ou 0 bits ativos no total. Logo, como é
podemos desconsiderar os bits desativados de
, já que somam 2 ou 0 pra
. Como temos exatamente
bits ativos, chegamos a conclusão que
.
Também perceba que o único caso onde o jogo está perdido para o jogador que vai escolher entre
e
para quebrar é quando
. Já que é impossível dividir um número
de 1 bit ativo em
e
seguindo as condições que
e
. Perceba que para chegar em
só podemos ter quebrado um número que tem
, por conta da observação anterior. Logo, chegamos a conclusão que o único estado ganhador advém de quebrar um número que tem
par.
Também perceba que sempre podemos garantir que sempre cairemos em um estado par, enquanto nosso oponente caí em um estado ímpar. Já que podemos quebrar um
com
par em dois
e
com
e
ímpar, fazendo com que o oponente só possa escolher um número
com
ímpar. E um oponente que vai quebrar um
ímpar só pode dividir ele em um ímpar e em um par, e quando isso acontece podemos simplesmente escolher o par toda vez. Como vamos diminuir o MSB (Most Significant Bit) do número em pelo menos 1 toda rodada, temos certeza que o jogo não dura mais que
, logo não precisamos nos preocupar com o limite.
Concluindo, nossa estratégia é:
- Se o número inicial
for par, jogar primeiro, se não, jogar segundo. - Sempre que tiver a opção de escolher entre
e
escolha o que tem
par (como nosso oponente sempre caí em um ímpar garantimos que sempre vai ter essa opção). - Quando for quebrar um número com
par, quebre ele em dois
tal que
.
Assim, garantimos que nunca perdemos o jogo!
Clique aqui para ver o código.
