ЕГЭ по информатике · задание 21

Теория игр: Ваня выигрывает первым или вторым ходом

Та же игра, что в заданиях 19 и 20. Нужно найти S, при котором Ваня выигрывает первым или вторым ходом при любой игре Пети, но не может гарантировать выигрыш первым ходом.

Что ищем

  • При любом ходе Пети Ваня выигрывает первым или вторым ходом.
  • Хотя бы один ход Пети не даёт Ване выиграть сразу.

Как решать

  1. Отметить позиции из заданий 19 и 20.
  2. Найти S, из которых все ходы ведут в эти позиции, причём хотя бы один — в позицию из задания 20.
  3. Проверить программой: f(s, 4) and not f(s, 2).

Типичные ошибки

  • Взять позицию, где Ваня всегда выигрывает первым ходом (это задание 19).
  • Перепутать минимальное и максимальное S.

Разобранные варианты

Сначала реши сам, потом открой разбор.

Вариант 1

одна куча, убывает · минимальное S

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может:
– убрать из кучи 2 камня;
– убрать из кучи 6 камней;
– уменьшить количество камней в куче в 4 раза (количество камней, полученное при делении, округляется до меньшего).
Например, из кучи в 30 камней за один ход можно получить кучу из 28, 24, 7 камней. Игра завершается, когда количество камней в куче становится не более 10. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу из 10 или менее камней. В начальный момент в куче было S камней, S ≥ 11.

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

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

Разбор

Рассуждение. Нужна позиция, где каждый ход Пети ведёт либо в позицию «выигрыш одним ходом», либо в позицию из задания 20 («выигрыш вторым ходом») — и хотя бы один ход ведёт во вторую. Тогда Ваня выигрывает первым или вторым ходом, но первым — не гарантированно.

Проверка для S = 48. Все ходы Пети ведут в позиции, где выигрывает Ваня, причём хотя бы в одной Ване нужен второй ход:

  • 12: Ваня выигрывает первым ходом
  • 42: Ваня выигрывает первым ходом
  • 46: Ваня выигрывает вторым ходом
SКто и когда выигрывает при правильной игре
45Ваня выигрывает 1-м ходом
46Петя выигрывает 2-м ходом
47Петя выигрывает 2-м ходом
48Ваня выигрывает 1-м или 2-м ходом
49Ваня выигрывает 1-м или 2-м ходом
50Петя выигрывает 2-м ходом
51Петя выигрывает 2-м ходом

Как работает программа. f(позиция, m) отвечает на вопрос: «выиграет ли нужный игрок не позднее, чем за m ходов (считая ходы обоих)». На нечётных шагах ходит тот, кто должен выиграть, — ему достаточно одного удачного хода (any); на чётных ходит соперник — выигрыш должен получаться при любом его ходе (all).

Ответ: 48

Решение на Python.

def f(s, m):
    if s <= 10:
        return m % 2 == 0
    if m == 0:
        return False
    h = [f(x, m - 1) for x in (s - 2, s - 6, s // 4)]
    return any(h) if m % 2 != 0 else all(h)

print(min(s for s in range(11, 410) if f(s, 4) and not f(s, 2)))

Вариант 2

одна куча, растёт · минимальное S

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может:
– добавить в кучу 2 камня;
– добавить в кучу 5 камней;
– увеличить количество камней в куче в 2 раза.
Например, из кучи в 10 камней за один ход можно получить кучу из 12, 15, 20 камней. Игра завершается, когда количество камней в куче становится не менее 67. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу из 67 или более камней. В начальный момент в куче было S камней, 1 ≤ S ≤ 66.

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

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

Разбор

Рассуждение. Нужна позиция, где каждый ход Пети ведёт либо в позицию «выигрыш одним ходом», либо в позицию из задания 20 («выигрыш вторым ходом») — и хотя бы один ход ведёт во вторую. Тогда Ваня выигрывает первым или вторым ходом, но первым — не гарантированно.

Проверка для S = 25. Все ходы Пети ведут в позиции, где выигрывает Ваня, причём хотя бы в одной Ване нужен второй ход:

  • 27: Ваня выигрывает вторым ходом
  • 30: Ваня выигрывает вторым ходом
  • 50: Ваня выигрывает первым ходом
SКто и когда выигрывает при правильной игре
22Ваня выигрывает не позднее 3-го хода
23Петя выигрывает 3-м ходом
24Петя выигрывает 3-м ходом
25Ваня выигрывает 1-м или 2-м ходом
26Ваня выигрывает 1-м или 2-м ходом
27Петя выигрывает 2-м ходом
28Петя выигрывает 2-м ходом

Как работает программа. f(позиция, m) отвечает на вопрос: «выиграет ли нужный игрок не позднее, чем за m ходов (считая ходы обоих)». На нечётных шагах ходит тот, кто должен выиграть, — ему достаточно одного удачного хода (any); на чётных ходит соперник — выигрыш должен получаться при любом его ходе (all).

Ответ: 25

Решение на Python.

def f(s, m):
    if s >= 67:
        return m % 2 == 0
    if m == 0:
        return False
    h = [f(x, m - 1) for x in (s + 2, s + 5, s * 2)]
    return any(h) if m % 2 != 0 else all(h)

print(min(s for s in range(1, 67) if f(s, 4) and not f(s, 2)))

Вариант 3

две кучи · минимальное S

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может:
– добавить в одну из куч 1 камень;
– увеличить количество камней в одной из куч в 2 раза.
Например, пусть в одной куче 10 камней, а в другой — 7; такую позицию обозначим (10, 7). За один ход из неё можно получить любую из позиций: (10, 8), (10, 14), (11, 7), (20, 7). Игра завершается, когда суммарное количество камней в кучах становится не менее 63. Победителем считается игрок, сделавший последний ход. В начальный момент в первой куче было 8 камней, во второй — S камней, 1 ≤ S ≤ 54.

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

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

Разбор

Рассуждение. Нужна позиция, где каждый ход Пети ведёт либо в позицию «выигрыш одним ходом», либо в позицию из задания 20 («выигрыш вторым ходом») — и хотя бы один ход ведёт во вторую. Тогда Ваня выигрывает первым или вторым ходом, но первым — не гарантированно.

Проверка для S = 22. Все ходы Пети ведут в позиции, где выигрывает Ваня, причём хотя бы в одной Ване нужен второй ход:

  • (8, 23): Ваня выигрывает вторым ходом
  • (8, 44): Ваня выигрывает первым ходом
  • (9, 22): Ваня выигрывает вторым ходом
  • (16, 22): Ваня выигрывает вторым ходом
SКто и когда выигрывает при правильной игре
19Ваня выигрывает не позднее 4-го хода
20Петя выигрывает 4-м ходом
21Петя выигрывает 3-м ходом
22Ваня выигрывает 1-м или 2-м ходом
23Петя выигрывает 2-м ходом
24Ваня выигрывает не позднее 3-го хода
25Петя выигрывает 3-м ходом

Как работает программа. f(позиция, m) отвечает на вопрос: «выиграет ли нужный игрок не позднее, чем за m ходов (считая ходы обоих)». На нечётных шагах ходит тот, кто должен выиграть, — ему достаточно одного удачного хода (any); на чётных ходит соперник — выигрыш должен получаться при любом его ходе (all).

Ответ: 22

Решение на Python.

def f(a, b, m):
    if a + b >= 63:
        return m % 2 == 0
    if m == 0:
        return False
    h = [f(x, y, m - 1) for x, y in ((a + 1, b), (a * 2, b), (a, b + 1), (a, b * 2))]
    return any(h) if m % 2 != 0 else all(h)

print(min(s for s in range(1, 55) if f(8, s, 4) and not f(8, s, 2)))

Вариант 4

одна куча, растёт · максимальное S

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может:
– добавить в кучу 1 камень;
– добавить в кучу 3 камня;
– увеличить количество камней в куче в 2 раза.
Например, из кучи в 10 камней за один ход можно получить кучу из 11, 13, 20 камней. Игра завершается, когда количество камней в куче становится не менее 63. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу из 63 или более камней. В начальный момент в куче было S камней, 1 ≤ S ≤ 62.

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

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

Разбор

Рассуждение. Нужна позиция, где каждый ход Пети ведёт либо в позицию «выигрыш одним ходом», либо в позицию из задания 20 («выигрыш вторым ходом») — и хотя бы один ход ведёт во вторую. Тогда Ваня выигрывает первым или вторым ходом, но первым — не гарантированно.

Проверка для S = 29. Все ходы Пети ведут в позиции, где выигрывает Ваня, причём хотя бы в одной Ване нужен второй ход:

  • 30: Ваня выигрывает вторым ходом
  • 32: Ваня выигрывает первым ходом
  • 58: Ваня выигрывает первым ходом
SКто и когда выигрывает при правильной игре
26Петя выигрывает 3-м ходом
27Ваня выигрывает 1-м или 2-м ходом
28Петя выигрывает 2-м ходом
29Ваня выигрывает 1-м или 2-м ходом
30Петя выигрывает 2-м ходом
31Ваня выигрывает 1-м ходом
32Петя выигрывает 1-м ходом

Как работает программа. f(позиция, m) отвечает на вопрос: «выиграет ли нужный игрок не позднее, чем за m ходов (считая ходы обоих)». На нечётных шагах ходит тот, кто должен выиграть, — ему достаточно одного удачного хода (any); на чётных ходит соперник — выигрыш должен получаться при любом его ходе (all).

Ответ: 29

Решение на Python.

def f(s, m):
    if s >= 63:
        return m % 2 == 0
    if m == 0:
        return False
    h = [f(x, m - 1) for x in (s + 1, s + 3, s * 2)]
    return any(h) if m % 2 != 0 else all(h)

print(max(s for s in range(1, 63) if f(s, 4) and not f(s, 2)))

Вариант 5

одна куча, убывает · минимальное S

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может:
– убрать из кучи 3 камня;
– убрать из кучи 7 камней;
– уменьшить количество камней в куче в 2 раза (количество камней, полученное при делении, округляется до меньшего).
Например, из кучи в 40 камней за один ход можно получить кучу из 37, 33, 20 камней. Игра завершается, когда количество камней в куче становится не более 20. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу из 20 или менее камней. В начальный момент в куче было S камней, S ≥ 21.

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

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

Разбор

Рассуждение. Нужна позиция, где каждый ход Пети ведёт либо в позицию «выигрыш одним ходом», либо в позицию из задания 20 («выигрыш вторым ходом») — и хотя бы один ход ведёт во вторую. Тогда Ваня выигрывает первым или вторым ходом, но первым — не гарантированно.

Проверка для S = 48. Все ходы Пети ведут в позиции, где выигрывает Ваня, причём хотя бы в одной Ване нужен второй ход:

  • 24: Ваня выигрывает первым ходом
  • 41: Ваня выигрывает первым ходом
  • 45: Ваня выигрывает вторым ходом
SКто и когда выигрывает при правильной игре
45Петя выигрывает 2-м ходом
46Петя выигрывает 2-м ходом
47Петя выигрывает 2-м ходом
48Ваня выигрывает 1-м или 2-м ходом
49Петя выигрывает 2-м ходом
50Петя выигрывает 2-м ходом
51Петя выигрывает 2-м ходом

Как работает программа. f(позиция, m) отвечает на вопрос: «выиграет ли нужный игрок не позднее, чем за m ходов (считая ходы обоих)». На нечётных шагах ходит тот, кто должен выиграть, — ему достаточно одного удачного хода (any); на чётных ходит соперник — выигрыш должен получаться при любом его ходе (all).

Ответ: 48

Решение на Python.

def f(s, m):
    if s <= 20:
        return m % 2 == 0
    if m == 0:
        return False
    h = [f(x, m - 1) for x in (s - 3, s - 7, s // 2)]
    return any(h) if m % 2 != 0 else all(h)

print(min(s for s in range(21, 420) if f(s, 4) and not f(s, 2)))

Вариант 6

две кучи · минимальное S

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может:
– добавить в одну из куч 2 камня;
– увеличить количество камней в одной из куч в 2 раза.
Например, пусть в одной куче 10 камней, а в другой — 7; такую позицию обозначим (10, 7). За один ход из неё можно получить любую из позиций: (10, 9), (10, 14), (12, 7), (20, 7). Игра завершается, когда суммарное количество камней в кучах становится не менее 67. Победителем считается игрок, сделавший последний ход. В начальный момент в первой куче было 5 камней, во второй — S камней, 1 ≤ S ≤ 61.

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

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

Разбор

Рассуждение. Нужна позиция, где каждый ход Пети ведёт либо в позицию «выигрыш одним ходом», либо в позицию из задания 20 («выигрыш вторым ходом») — и хотя бы один ход ведёт во вторую. Тогда Ваня выигрывает первым или вторым ходом, но первым — не гарантированно.

Проверка для S = 26. Все ходы Пети ведут в позиции, где выигрывает Ваня, причём хотя бы в одной Ване нужен второй ход:

  • (5, 28): Ваня выигрывает вторым ходом
  • (5, 52): Ваня выигрывает первым ходом
  • (7, 26): Ваня выигрывает вторым ходом
  • (10, 26): Ваня выигрывает вторым ходом
SКто и когда выигрывает при правильной игре
23Ваня выигрывает не позднее 3-го хода
24Петя выигрывает 3-м ходом
25Петя выигрывает 3-м ходом
26Ваня выигрывает 1-м или 2-м ходом
27Ваня выигрывает 1-м или 2-м ходом
28Петя выигрывает 2-м ходом
29Петя выигрывает 2-м ходом

Как работает программа. f(позиция, m) отвечает на вопрос: «выиграет ли нужный игрок не позднее, чем за m ходов (считая ходы обоих)». На нечётных шагах ходит тот, кто должен выиграть, — ему достаточно одного удачного хода (any); на чётных ходит соперник — выигрыш должен получаться при любом его ходе (all).

Ответ: 26

Решение на Python.

def f(a, b, m):
    if a + b >= 67:
        return m % 2 == 0
    if m == 0:
        return False
    h = [f(x, y, m - 1) for x, y in ((a + 2, b), (a * 2, b), (a, b + 2), (a, b * 2))]
    return any(h) if m % 2 != 0 else all(h)

print(min(s for s in range(1, 62) if f(5, s, 4) and not f(5, s, 2)))

Вариант 7

одна куча, убывает · минимальное S

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может:
– убрать из кучи 2 камня;
– убрать из кучи 4 камня;
– уменьшить количество камней в куче в 3 раза (количество камней, полученное при делении, округляется до меньшего).
Например, из кучи в 50 камней за один ход можно получить кучу из 48, 46, 16 камней. Игра завершается, когда количество камней в куче становится не более 30. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу из 30 или менее камней. В начальный момент в куче было S камней, S ≥ 31.

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

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

Разбор

Рассуждение. Нужна позиция, где каждый ход Пети ведёт либо в позицию «выигрыш одним ходом», либо в позицию из задания 20 («выигрыш вторым ходом») — и хотя бы один ход ведёт во вторую. Тогда Ваня выигрывает первым или вторым ходом, но первым — не гарантированно.

Проверка для S = 99. Все ходы Пети ведут в позиции, где выигрывает Ваня, причём хотя бы в одной Ване нужен второй ход:

  • 33: Ваня выигрывает первым ходом
  • 95: Ваня выигрывает вторым ходом
  • 97: Ваня выигрывает вторым ходом
SКто и когда выигрывает при правильной игре
96Петя выигрывает 2-м ходом
97Петя выигрывает 2-м ходом
98Петя выигрывает 2-м ходом
99Ваня выигрывает 1-м или 2-м ходом
100Ваня выигрывает 1-м или 2-м ходом
101Петя выигрывает 3-м ходом
102Петя выигрывает 3-м ходом

Как работает программа. f(позиция, m) отвечает на вопрос: «выиграет ли нужный игрок не позднее, чем за m ходов (считая ходы обоих)». На нечётных шагах ходит тот, кто должен выиграть, — ему достаточно одного удачного хода (any); на чётных ходит соперник — выигрыш должен получаться при любом его ходе (all).

Ответ: 99

Решение на Python.

def f(s, m):
    if s <= 30:
        return m % 2 == 0
    if m == 0:
        return False
    h = [f(x, m - 1) for x in (s - 2, s - 4, s // 3)]
    return any(h) if m % 2 != 0 else all(h)

print(min(s for s in range(31, 430) if f(s, 4) and not f(s, 2)))

Вариант 8

одна куча, растёт · максимальное S

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может:
– добавить в кучу 2 камня;
– добавить в кучу 3 камня;
– увеличить количество камней в куче в 3 раза.
Например, из кучи в 10 камней за один ход можно получить кучу из 12, 13, 30 камней. Игра завершается, когда количество камней в куче становится не менее 89. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу из 89 или более камней. В начальный момент в куче было S камней, 1 ≤ S ≤ 88.

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

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

Разбор

Рассуждение. Нужна позиция, где каждый ход Пети ведёт либо в позицию «выигрыш одним ходом», либо в позицию из задания 20 («выигрыш вторым ходом») — и хотя бы один ход ведёт во вторую. Тогда Ваня выигрывает первым или вторым ходом, но первым — не гарантированно.

Проверка для S = 24. Все ходы Пети ведут в позиции, где выигрывает Ваня, причём хотя бы в одной Ване нужен второй ход:

  • 26: Ваня выигрывает вторым ходом
  • 27: Ваня выигрывает вторым ходом
  • 72: Ваня выигрывает первым ходом
SКто и когда выигрывает при правильной игре
21Петя выигрывает 3-м ходом
22Петя выигрывает 3-м ходом
23Ваня выигрывает 1-м или 2-м ходом
24Ваня выигрывает 1-м или 2-м ходом
25Петя выигрывает 2-м ходом
26Петя выигрывает 2-м ходом
27Петя выигрывает 2-м ходом

Как работает программа. f(позиция, m) отвечает на вопрос: «выиграет ли нужный игрок не позднее, чем за m ходов (считая ходы обоих)». На нечётных шагах ходит тот, кто должен выиграть, — ему достаточно одного удачного хода (any); на чётных ходит соперник — выигрыш должен получаться при любом его ходе (all).

Ответ: 24

Решение на Python.

def f(s, m):
    if s >= 89:
        return m % 2 == 0
    if m == 0:
        return False
    h = [f(x, m - 1) for x in (s + 2, s + 3, s * 3)]
    return any(h) if m % 2 != 0 else all(h)

print(max(s for s in range(1, 89) if f(s, 4) and not f(s, 2)))

Вариант 9

две кучи · минимальное S

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может:
– добавить в одну из куч 1 камень;
– увеличить количество камней в одной из куч в 3 раза.
Например, пусть в одной куче 10 камней, а в другой — 7; такую позицию обозначим (10, 7). За один ход из неё можно получить любую из позиций: (10, 8), (10, 21), (11, 7), (30, 7). Игра завершается, когда суммарное количество камней в кучах становится не менее 41. Победителем считается игрок, сделавший последний ход. В начальный момент в первой куче было 12 камней, во второй — S камней, 1 ≤ S ≤ 28.

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

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

Разбор

Рассуждение. Нужна позиция, где каждый ход Пети ведёт либо в позицию «выигрыш одним ходом», либо в позицию из задания 20 («выигрыш вторым ходом») — и хотя бы один ход ведёт во вторую. Тогда Ваня выигрывает первым или вторым ходом, но первым — не гарантированно.

Проверка для S = 2. Все ходы Пети ведут в позиции, где выигрывает Ваня, причём хотя бы в одной Ване нужен второй ход:

  • (12, 3): Ваня выигрывает вторым ходом
  • (12, 6): Ваня выигрывает первым ходом
  • (13, 2): Ваня выигрывает первым ходом
  • (36, 2): Ваня выигрывает первым ходом
SКто и когда выигрывает при правильной игре
1Петя выигрывает 2-м ходом
2Ваня выигрывает 1-м или 2-м ходом
3Петя выигрывает 2-м ходом
4Ваня выигрывает 1-м ходом
5Петя выигрывает 1-м ходом

Как работает программа. f(позиция, m) отвечает на вопрос: «выиграет ли нужный игрок не позднее, чем за m ходов (считая ходы обоих)». На нечётных шагах ходит тот, кто должен выиграть, — ему достаточно одного удачного хода (any); на чётных ходит соперник — выигрыш должен получаться при любом его ходе (all).

Ответ: 2

Решение на Python.

def f(a, b, m):
    if a + b >= 41:
        return m % 2 == 0
    if m == 0:
        return False
    h = [f(x, y, m - 1) for x, y in ((a + 1, b), (a * 3, b), (a, b + 1), (a, b * 3))]
    return any(h) if m % 2 != 0 else all(h)

print(min(s for s in range(1, 29) if f(12, s, 4) and not f(12, s, 2)))

Вариант 10

одна куча, убывает · минимальное S

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может:
– убрать из кучи 1 камень;
– убрать из кучи 7 камней;
– уменьшить количество камней в куче в 3 раза (количество камней, полученное при делении, округляется до меньшего).
Например, из кучи в 40 камней за один ход можно получить кучу из 39, 33, 13 камней. Игра завершается, когда количество камней в куче становится не более 20. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу из 20 или менее камней. В начальный момент в куче было S камней, S ≥ 21.

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

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

Разбор

Рассуждение. Нужна позиция, где каждый ход Пети ведёт либо в позицию «выигрыш одним ходом», либо в позицию из задания 20 («выигрыш вторым ходом») — и хотя бы один ход ведёт во вторую. Тогда Ваня выигрывает первым или вторым ходом, но первым — не гарантированно.

Проверка для S = 65. Все ходы Пети ведут в позиции, где выигрывает Ваня, причём хотя бы в одной Ване нужен второй ход:

  • 21: Ваня выигрывает первым ходом
  • 58: Ваня выигрывает первым ходом
  • 64: Ваня выигрывает вторым ходом
SКто и когда выигрывает при правильной игре
62Петя выигрывает 1-м ходом
63Ваня выигрывает 1-м ходом
64Петя выигрывает 2-м ходом
65Ваня выигрывает 1-м или 2-м ходом
66Петя выигрывает 3-м ходом
67Ваня выигрывает не позднее 3-го хода
68Петя выигрывает 4-м ходом

Как работает программа. f(позиция, m) отвечает на вопрос: «выиграет ли нужный игрок не позднее, чем за m ходов (считая ходы обоих)». На нечётных шагах ходит тот, кто должен выиграть, — ему достаточно одного удачного хода (any); на чётных ходит соперник — выигрыш должен получаться при любом его ходе (all).

Ответ: 65

Решение на Python.

def f(s, m):
    if s <= 20:
        return m % 2 == 0
    if m == 0:
        return False
    h = [f(x, m - 1) for x in (s - 1, s - 7, s // 3)]
    return any(h) if m % 2 != 0 else all(h)

print(min(s for s in range(21, 420) if f(s, 4) and not f(s, 2)))

Для самостоятельного решения

Варианты 11–15 без разборов. Ответ можно проверить кнопкой.

Вариант 11

одна куча, растёт · минимальное S

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может:
– добавить в кучу 1 камень;
– добавить в кучу 5 камней;
– увеличить количество камней в куче в 2 раза.
Например, из кучи в 10 камней за один ход можно получить кучу из 11, 15, 20 камней. Игра завершается, когда количество камней в куче становится не менее 82. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу из 82 или более камней. В начальный момент в куче было S камней, 1 ≤ S ≤ 81.

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

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

Вариант 12

одна куча, убывает · минимальное S

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может:
– убрать из кучи 2 камня;
– убрать из кучи 6 камней;
– уменьшить количество камней в куче в 4 раза (количество камней, полученное при делении, округляется до меньшего).
Например, из кучи в 30 камней за один ход можно получить кучу из 28, 24, 7 камней. Игра завершается, когда количество камней в куче становится не более 10. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу из 10 или менее камней. В начальный момент в куче было S камней, S ≥ 11.

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

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

Вариант 13

две кучи · минимальное S

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может:
– добавить в одну из куч 1 камень;
– увеличить количество камней в одной из куч в 2 раза.
Например, пусть в одной куче 10 камней, а в другой — 7; такую позицию обозначим (10, 7). За один ход из неё можно получить любую из позиций: (10, 8), (10, 14), (11, 7), (20, 7). Игра завершается, когда суммарное количество камней в кучах становится не менее 83. Победителем считается игрок, сделавший последний ход. В начальный момент в первой куче было 3 камней, во второй — S камней, 1 ≤ S ≤ 79.

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

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

Вариант 14

одна куча, растёт · минимальное S

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может:
– добавить в кучу 2 камня;
– добавить в кучу 3 камня;
– увеличить количество камней в куче в 2 раза.
Например, из кучи в 10 камней за один ход можно получить кучу из 12, 13, 20 камней. Игра завершается, когда количество камней в куче становится не менее 58. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу из 58 или более камней. В начальный момент в куче было S камней, 1 ≤ S ≤ 57.

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

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

Вариант 15

одна куча, убывает · минимальное S

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может:
– убрать из кучи 3 камня;
– убрать из кучи 5 камней;
– уменьшить количество камней в куче в 3 раза (количество камней, полученное при делении, округляется до меньшего).
Например, из кучи в 40 камней за один ход можно получить кучу из 37, 35, 13 камней. Игра завершается, когда количество камней в куче становится не более 20. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу из 20 или менее камней. В начальный момент в куче было S камней, S ≥ 21.

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

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