Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу два или три камня либо увеличить количество камней в куче в два раза. У каждого игрока есть неограниченное количество камней, чтобы делать ходы.
Игра завершается в тот момент, когда количество камней в куче становится не менее 80. Победителем считается игрок, сделавший последний ход, т.е. первым получивший кучу из 80 камней или больше.
В начальный момент в куче было S камней; .
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Укажите минимальное значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим первым ходом.
Решение руками
Для начала определим значения, при которых Петя побеждает первым ходом. Максимальный ход доступный нам в партии это Минимальное значение отрезка значений, в которых Петя побеждает первым ходом равняется:
Получается, что в отрезке [40;79] Петя выигрывает своим первым ходом. Теперь определим значение, в котором Ваня побеждает своим первым ходом. Значение, из которого ВСЕ ходы ведут в вышеописанный отрезок – это значение, в котором Ваня выигрывает своим первым ходом. Распишем значение и стратегии, при которых Ваня побеждает первым ходом:
. Петя может увеличить количество камней до
,
или
камней. Во всех этих случаях Ване не составит труда завершить партию следующим ходом.
. Петя может увеличить количество камней до
,
или
камней. Во всех этих случаях Ване не составит труда завершить партию следующим ходом.
В ответ нужно указать минимальное значение S. Ответ:
Решение БУ
from functools import lru_cache
@lru_cache(None)
def f(x):
if x >= 80:
return 0
t = [f(x + 2), f(x + 3), f(x * 2)]
h = [i for i in t if i <= 0]
if h:
return -max(h) + 1
else:
return -max(t)
for s in range(1, 79 + 1):
if f(s) == -1:
print(s)
break