Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может:
— убрать из кучи 3 камня;
— убрать из кучи 5 камней;
— уменьшить количество камней в куче в 4 раза (количество камней, полученное при делении, округляется до меньшего).
Например, из кучи в 20 камней за один ход можно получить кучу из 17, 15 или 5 камней.
Игра завершается, когда количество камней в куче становится не более 30.
Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу из 30 или менее камней. В начальный момент в куче было S камней, S ≥ 31.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Укажите минимальное значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим первым ходом.
Приведём решение на языке Python.
def f(x, h):
if h == 3 and x <= 30:
return 1
elif h == 3 and x > 30:
return 0
elif x <= 30 and h < 3:
return 0
else:
if h % 2 == 0:
return f(x - 3, h + 1) or f(x - 5, h + 1) or f(x // 4, h + 1)
else:
return f(x - 3, h + 1) and f(x - 5, h + 1) and f(x // 4, h + 1)
for x in range(1000):
if f(x, 1) == 1:
print(x)
break
Ответ: 124.
Приведём аналитическое решение Александра Козлова.
Решение задач с камешками методом «Лунная походка»
Задача 19
Анализ позиции: Мы ищем количество камней в куче, необходимое и достаточное для победы Пети, который делает первый ход. Известно, что Петя выигрывает, если количество камней в куче составляет от 31 до 120 (поскольку 120/4 = 30).
Проверка позиций: Начинаем с 121 и движемся вниз, проверяя каждую позицию, чтобы определить, может ли Петя выиграть. Метод «Лунная походка» заключается в том, чтобы отступать от выигрышных позиций и проверять, как они влияют на текущую.
Позиция 121: 121/4=30.25 ==30 (округляется до 30) — выигрышная для Пети.
Позиция 122: 122/4=30.50 == 30 (округляется до 30) — выигрышная для Пети.
Позиция 123: 123/4=30.75 == 30 (округляется до 30) — выигрышная для Пети.
Вывод 1: Ходы из позиций 31, 32, …, 121, 122 или 123 — выигрышные.
Продолжаем проверку следующих позиций:
Позиция 124: После любого хода Пети например, 124/4=31, 124−5=119 или 124−3=121, Ваня всегда выигрывает. Это проигрышная позиция для Пети.
Позиция 125: Аналогично, Ваня выигрывает.
Позиция 126: Тоже проигрышная для Пети.
Вывод 2: Ходы из позиций 124, 125 и 126 приводят к проигрышу первого игрока, но являются выигрышными для второго.
Ответ на задачу 19: Минимальное значение S=124
Приведём решение Александра Козлова на языке Python.
from functools import *
def m(h):
return h//4,h-3,h-5
@lru_cache(None)
def g(h):
if h<=30:return 'w'
if any(g(i)=='w' for i in m(h)):return 'p1'
if all(g(i)=='p1' for i in m(h)):return 'v1'
if any(g(i)=='v1' for i in m(h)):return 'p2'
if all(g(i)=='p1' or g(i)=='p2' for i in m(h)):return 'v2'
for i in range(120,140):
if g(i)!= None and g(i)!='w':
print(i,g(i))

