Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней, не меньше одного камня в каждой. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в большую кучу любое количество камней от одного до трёх или удвоить количество камней в меньшей куче. Если кучи содержат равное количество камней, можно добавить в любую из них от одного до трёх камней, удвоение в этой ситуации запрещено.
Игра завершается в тот момент, когда количество камней в одной из куч достигает 48. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 48 или больше камней. Известно, что Петя смог выиграть первым ходом. Какое наименьшее число камней могло быть суммарно в двух кучах?
В игре, описанной в задании 19, в начальный момент в первой куче было 13 камней, а во второй — S камней, 1 ≤ S ≤ 47.
Укажите минимальное и максимальное из таких значений S, при которых Петя не может выиграть первым ходом, но у Пети есть выигрышная стратегия, позволяющая ему выиграть вторым ходом при любой игре Вани.
В ответе запишите сначала минимальное значение, затем максимальное.
В игре, описанной в задании 19, в начальный момент в первой куче было 39 камней, а во второй — S камней, 1 ≤ S ≤ 47.
Найдите такое значение S, при котором у Вани есть стратегия, позволяющая ему выиграть вторым ходом при любой игре Пети, но у Вани нет стратегии, которая позволяла бы ему гарантированно выиграть первым ходом.
Добавлено: 08.05.26 13:13
Решение на Python:
def f(m, s1, s2):
if s1 >= 48 or s2 >= 48:
return m % 2 == 0
if m == 0:
return 0
if s1 > s2:
h = [f(m - 1, s1 + i, s2) for i in range(1, 4)] + [(f(m - 1, s1, s2 * 2))]
if s1 < s2:
h = [f(m - 1, s1, s2 + i) for i in range(1, 4)] + [(f(m - 1, s1 * 2, s2))]
if s1 == s2:
h = [f(m - 1, s1, s2 + j) for j in range(1, 4)] + [f(m-1, s1 + j, s2) for j in range(1,4)]
return any(h) if m % 2 != 0 else all(h)
print("19:", min([s1+s2 for s1 in range(1, 48) for s2 in range(1, 48) if f(1, s1, s2)])) # 46
print("20:", [s2 for s2 in range(1, 48) if not f(1, 13, s2) and f(3, 13, s2)]) # 26, 43
print("21:", [s2 for s2 in range(1, 48) if not f(2, 39, s2) and f(4, 39, s2)]) # 20Ответы:
19: 46
20: 26 43
21: 20
Автор - rubygem17
None