Задание №20 — Теория игр
Условие игры
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень или увеличить количество камней в куче в два раза. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.
Игра завершается в тот момент, когда количество камней в куче становится не менее 129. Победителем считается игрок, сделавший последний ход, т.е. первым получивший кучу из 129 или больше камней.
В начальный момент в куче было S камней, 1 ≤ S ≤ 128.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Укажите минимальное значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим первым ходом.
Для игры, описанной выше, найдите два наименьших значения S, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
– Петя не может выиграть за один ход;
– Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.
Найденные значения запишите в ответе в порядке возрастания.
Правильный ответ
32 63
Пояснение
Решение:
Сначала опишем позиции, из которых игра заканчивается одним ходом. Из кучи в камней () ходящий выигрывает сразу, если или , то есть при . Значит, при от 65 до 128 ходящий побеждает немедленно.
Теперь найдём позицию, в которую Пете выгодно попасть после первого хода. Из кучи в 64 камня возможны только 65 и 128 — обе позиции выигрышны для соперника, поэтому 64 проигрышна для того, кто из неё ходит. Более того, 64 — единственная такая позиция: чтобы все ходы вели в диапазон 65–128, нужно , то есть , и одновременно , иначе ходящий выиграл бы сам.
Итак, стратегия Пети — первым ходом получить ровно 64 камня, после чего Ваня вынужденно отдаёт позицию 65 или 128, и Петя добивает вторым ходом (из 65 удвоением до 130, из 128 добавлением камня до 129). Попасть в 64 можно из (добавить камень) и из (удвоить). Оба значения не превосходят 64, поэтому первым ходом Петя выиграть не может — второе условие задачи тоже выполнено.
Записываем найденные значения в порядке возрастания: 32 и 63.
def win_now(s):
return s + 1 >= 129 or 2 * s >= 129
res = []
for s in range(1, 129):
if win_now(s): # Петя выигрывает сразу — не подходит
continue
for m in (s + 1, 2 * s): # ход Пети
if not win_now(m) and all(win_now(k) for k in (m + 1, 2 * m)):
res.append(s)
break
print(res[:2]) # [32, 63]
Ответ: 32 63