Подготовка к школе
1 класс
2 класс
3 класс
4 класс
5 класс
6 класс
7 класс
8 класс
9 класс
10 класс
11 класс
ОГЭ
ЕГЭ
Для всех
Назад

20. Выигрышная стратегия: часть 2: #295291

Сообщить о проблеме
Задание #295291
Задание было решено верно
Задание было решено неверно

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя.

За один ход игрок может добавить в кучу $2$ камня или увеличить количество камней в куче в $3$ раза. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.

Игра завершается в тот момент, когда количество камней в куче становится не менее $79$. Победителем считается игрок, сделавший последний ход, т.е. первым получивший кучу, в которой находится $79$ или больше камней.

В начальный момент в куче было $S$ камней; $1 \leq S \leq 78$.

Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.

Для игры, описанной в задании $19$, найдите два наименьших значения $S$, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:

  • Петя не может выиграть за один ход;
  • Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.

Найденные значения запишите в ответе в порядке возрастания без пробелов.

Первый способ – математическое решение

Петя не должен выигрывать первым ходом, поэтому $3S<79$, откуда $S\leq26$.

Чтобы Петя гарантированно выиграл вторым ходом, первым ходом ему нужно получить $25$ или $26$ камней.

При $25$ камнях Ваня может получить: $25\rightarrow27$ или $25\rightarrow75$.

Из обеих позиций Петя выигрывает следующим ходом:

$27\rightarrow81$;
$75\rightarrow225$.

При $26$ камнях: $26\rightarrow28$ или $26\rightarrow78$, и Петя также выигрывает следующим ходом:

$28\rightarrow84$;
$78\rightarrow80$.

Получить эти позиции можно так:

$23\rightarrow25$;
$24\rightarrow26$.

Второй способ – решение с помощью Python

def moves(x):
    return [x + 2, x * 3]

def win1(x):
    return x < 79 and any(
        y >= 79 for y in moves(x)
    )

ans = []

for S in range(1, 79):
    if not win1(S):
        if any(
            x < 79 and all(
                y < 79 and win1(y)
                for y in moves(x)
            )
            for x in moves(S)
        ):
            ans.append(S)

print(ans[:2])

Программа проверяет, что Петя не может выиграть первым ходом, а затем ищет такой его ход, после которого при любом ходе Вани Петя выигрывает следующим ходом.

Программа выведет: $[23,\ 24]$.

Показать
Очки опыта 20
Спросить Зави
0 заданий сегодня

Предложить улучшение