Краткий ответ:
- \(S=19\).
- \(S=15\) и \(S=18\), ответ без разделителей: 1518.
- Максимальное значение \(S\): 17.
Решение
За ход можно получить:
\[ S+1,\quad S+4,\quad 2S. \]
Выигрыш за один ход возможен при \(S\ge 20\), поэтому выигрышные позиции для игрока, который ходит сейчас:
\[ 20\le S\le 39. \]
Задание 1
Петя не может выиграть первым ходом, но после любого его хода Ваня должен иметь возможность выиграть сразу.
Все ходы из \(S\) должны привести к числу не меньше 20:
\[ S+1\ge20,\quad S+4\ge20,\quad 2S\ge20. \]
При условии \(S<20\) подходит только:
\[ \boxed{S=19}. \]
Из 19 Петя получает 20, 23 или 38, и Ваня сразу удваивает количество камней.
Задание 2
Петя должен первым ходом получить позицию 19. Тогда после любого хода Вани получится 20, 23 или 38, и Петя выиграет следующим ходом.
Получить 19 можно из:
\[ 15+4=19,\qquad 18+1=19. \]
Ответ:
\[ \boxed{1518}. \]
Задание 3
Ваня может выиграть за один или два своих хода из позиций:
\[ 15,\ 18,\ 20,\ldots,39. \]
Проверяем ходы Пети:
- \(S=14\): \(15,18,28\);
- \(S=17\): \(18,21,34\);
- \(S=19\): \(20,23,38\), но здесь Ваня выигрывает уже за один ход.
Значит, подходят \(S=14\) и \(S=17\). Максимальное:
\[ \boxed{17}. \]
Программа на Python
def moves(s):
return (s + 1, s + 4, 2 * s)
# Текущий игрок может выиграть своим первым ходом
def win_one(s):
return any(x >= 40 for x in moves(s))
# Текущий игрок выигрывает своим вторым ходом,
# но не может выиграть первым
def win_two(s):
if win_one(s):
return False
# Первый ход ведёт в x.
# После любого хода соперника y текущий игрок
# должен иметь возможность выиграть сразу.
return any(
x < 40 and
all(y < 40 and win_one(y) for y in moves(x))
for x in moves(s)
)
def win_one_or_two(s):
return win_one(s) or win_two(s)
# Ваня выигрывает сразу после любого первого хода Пети
def vanya_one(s):
return all(x < 40 and win_one(x) for x in moves(s))
# Ваня выигрывает за один или два своих хода
def vanya_one_or_two(s):
return all(x < 40 and win_one_or_two(x) for x in moves(s))
values = range(1, 40)
answer_1 = [
s for s in values
if not win_one(s) and vanya_one(s)
]
answer_2 = [
s for s in values
if win_two(s)
]
answer_3 = [
s for s in values
if vanya_one_or_two(s) and not vanya_one(s)
]
print("1)", answer_1)
print("2)", "".join(map(str, answer_2)))
print("3)", max(answer_3))
Вывод программы:
1) [19]
2) 1518
3) 17
