Источник: https://kpolyakov.spb.ru/
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один или два камня или увеличить количество камней в куче в три раза. Например, имея кучу из 10 камней, за один ход можно получить кучу из 11, 12 или 30 камней. У каждого игрока, чтобы делать ходы, есть неограниченное количество камней. Игра завершается в тот момент, когда количество камней в круче становится не менее 51. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 51 или больше камней.
В начальный момент в куче было камней,
.
1. При каких : 1a) Петя выигрывает первым ходом; 1б) Ваня выигрывает первым ходом?
2. Назовите два значения , при которых Петя может выиграть своим вторым ходом?
3. Назовите значение , при котором Ваня выигрывает своим первым или вторым ходом.
В ответе укажите сначала левую границу отрезка из ответа на вопрос 1a), затем через пробел правую, затем через пробел ответ на вопрос 1б), затем через пробел первое значение из ответа на 2 вопрос, затем через пробел второе значение из ответа на вопрос 2, затем через пробел ответ на вопрос 3.
Из условия игроки могут делать ходы: .
1a. Найдем при каких значениях S Петя выиграет первым ходом: . Эта позиция будет выигрышной для любого игрока, у которого она окажется.
1б. Для того чтобы Ваня выиграл своим первым ходом после хода Пети, у него должна быть позиция . При этом Петя не делает неудачные ходы. Это значение 16.
2. Для того чтобы найти начальные значения , из которых выигрывает Петя своим вторым ходом, нужно рассмотреть проигрышную позицию 16. Петя после своего первого хода должен сделать так, чтобы эти позиции достались Ване. Поэтому это значения
.
3. Найдем значение , при котором Ваня выиграет своим первым или вторым ходом. Для этого Ваня должен попасть в значения
либо в значения
.
Получаем, что , так как из него можно попасть в 39 ходом
, в 14 ходом
или в 15 ходом
.
from functools import *
@lru_cache(None)
def f(a):
if a >= 51: return 0
n = [f(a+1), f(a+2), f(a*3)]
t = [i for i in n if i <= 0]
if t: return -max(t)+1
return -max(n)
for i in range(1, 51):
if f(i) == 1: print(i)