Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может увеличить количество камней во второй куче в два раза или поменять кучи местами. Второй раз менять кучи, если это уже сделал противник, нельзя. Чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее . Победителем считается игрок, сделавший последний ход, т. е. первым получивший позицию, в которой в кучах будет
или больше камней.
В начальный момент в первой куче было камней, во второй куче —
камней,
. Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Назовите минимальное значение , при котором это возможно.
from functools import lru_cache
# c = 1 если в прошлый ход меняли кучи местами
def moves(h):
a, b, c = h
res = []
res.append((a, b * 2, 0))
if c == 0:
res.append((b, a, 1))
return tuple(res)
@lru_cache(None)
def f(h):
if sum(h[:2]) >= 199:
return "END"
if any((f(x) == "END") for x in moves(h)):
return "P1"
if any((f(x) == "P1") for x in moves(h)):
return "V1"
for s in range(1, 100):
h = 99, s, 0
if f(h) == "V1":
print(s, "V1")