Для игры, описанной в задании 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)
s = 0
for i in range(1,272):
if f(i,0) == 2:
s += i #Складываем значения,при которых Петя выигрывает вторым ходом
print(s)