Два игрока, Паша и Вася, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Паша. За один ход игрок может добавить в кучу один или четыре камня или увеличить количество камней в куче в пять раз. Игра завершается в тот момент, когда количество камней в куче становится не менее 69. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 69 или больше камней. В начальный момент в куче было S камней, 1 ≤ S ≤ 68.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, то есть не являющиеся выигрышными независимо от игры противника.
Известно, что Вася выиграл своим первым ходом после неудачного первого хода Паши. Укажите минимальное значение S, когда такая ситуация возможна.
Найдите два таких значения S, при которых у Паши есть выигрышная стратегия, причём одновременно выполняются два условия:
— Паша не может выиграть за один ход;
— Паша может выиграть своим вторым ходом независимо от того, как будет ходить Вася.
Найденные значения запишите в ответе в порядке возрастания без разделительных знаков.
Найдите минимальное значение S, при котором одновременно выполняются два условия:
— у Васи есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Паши;
— у Васи нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Добавлено: 10.05.26 17:00
Решение на Python:
def f(m, s1):
if s1 >= 69:
return m % 2 == 0
if m == 0:
return 0
h = [f(m-1, s1+1), f(m-1, s1+4), f(m-1, s1*5)]
# для решения 19 смените all на any
return any(h) if m % 2 != 0 else all(h)
print("19", min([s for s in range(1, 69) if f(2, s)])) # 3
print("20", [s for s in range(1, 69) if not f(1, s) and f(3, s)]) # 912
print("21", [s for s in range(1, 69) if not f(2, s) and (f(2, s) or f(4, s))]) # 8Ответ 19: 3
Ответ 20: 912
Ответ 21: 8
Автор - rubygem17
None