Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень, добавить два камня или увеличить количество камней в куче в два раза. При этом не разрешается делать ход, после которого количество камней в куче будет делиться
Например, если в начале игры в куче
Игра завершается, когда количество камней в куче становится
Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой
В начальный момент в куче было S не делится
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Укажите два
В ответе запишите найденные значения в порядке возрастания: сначала меньшее, затем большее.
Для того, чтобы Петя выиграл своим вторым ходом при любой игре Вани, Петя должен получить своим первым ходом
Получить 50 своим первым ходом можно из значений
Рассмотрим
Число 48 не подходит по условию задачи, так как делится
Рассмотрим
Ответ: 25 и 49.
Приведём решение Юрия Красильникова на языке Python.
def игра(ход,лимит,куча):
# (Номер хода, ограничение на число ходов, количество камней)
# результаты: 1 - выигрыш 1-го игрока, 2 - второго, 0 - победителя нет
игрок = 2-ход%2 # нечетные ходы - игрок 1, четные - игрок 2
враг = 3-игрок # противник текущего игрока
if куча >= 103: return враг # противник только что сделал выигрышный ход
if ход > лимит: return 0 # превышено число ходов
позиции1 = [куча+1,куча+2,куча*2] # ходы: +1, +2, *2
позиции = [x for x in позиции1 if x%3 != 0] # ходы, когда результат не делится на 3
результаты = [игра(ход+1,лимит,поз) for поз in позиции] # результаты ходов
if all([рез==враг for рез in результаты]): return враг # все ходы заканчиваются выигрышем врага
if any ([рез==игрок for рез in результаты]): return игрок # у игрока есть выигрышный ход
return 0 # выигрышных ходов нет, но и не все ходы проигрышные
print('№ 19:',*[s for s in range(1,102) if s%3!=0 and игра(1,2,s)==2])
print('№ 20:',*[s for s in range(1,102) if s%3!=0 and игра(1,1,s)==0 and игра(1,3,s)==1])
print('№ 21:',*[s for s in range(1,102) if s%3!=0 and игра(1,2,s)==0 and игра(1,4,s)==2])

