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.