Для игры, описанной в задании 19, найдите минимальное значение S, при котором одновременно выполняются два условия:
— у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
— у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Решение руками
Если второй ход Пети приведет его в область проигрыша, значит, в этой позиции Ваня победит в игре своим вторым ходом.
Такие позиции происходят при и
камнях. В независимости какие ходы будет делать Петя, он всё равно проиграет.
Поскольку в условии нас просят ввести минимальное значение, то в ответ записываем .
Решение программой
from functools import lru_cache
lru_cache(None)
def f(a,c):# параметр ’с’ в этой программе - это счётчик,сделанных ходов в данной партии.
# В данной задаче он обязателен,поскольку изначальное кол-во камней может быть слишком мало,а также есть ходы,которые не так сильно увеличивают кол-во камней в куче(+2,+4),как,например ход (*3).
# По этой причине у нас может возникнуть ошибка,связанная с превышением глубины рекурсии или же программа будет слишком долго высчитывать значения.
if a >= 271:return 0
if c > 7:return 1000 #Возвращаем очень большое значение,которое указывает программе,что при таком значении невозможно дойти до выигрыша при малом количестве ходов.
t = [f(a+2,c+1),f(a+4,c+1),f(a*3,c+1)]
n = [i for i in t if i <= 0]
if n:return -max(n) + 1
return -max(t)
for i in range(1,272):
if f(i,0) == -2:
print(i)
break