Теория игр: Ваня выигрывает первым или вторым ходом
Та же игра, что в заданиях 19 и 20. Нужно найти S, при котором Ваня выигрывает первым или вторым ходом при любой игре Пети, но не может гарантировать выигрыш первым ходом.
Что ищем
При любом ходе Пети Ваня выигрывает первым или вторым ходом.
Хотя бы один ход Пети не даёт Ване выиграть сразу.
Как решать
Отметить позиции из заданий 19 и 20.
Найти S, из которых все ходы ведут в эти позиции, причём хотя бы один — в позицию из задания 20.
Проверить программой: 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, при котором одновременно выполняются два условия: – у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети; – у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.