Новая Школа - онлайн-школа подготовки к ЕГЭ
Информатика · 11 класс Задача №3696338
А
Аноним
29 сентября 2026 15:24 · публичный вопрос
А
Аноним

Напиши ответ с решением (программой)

Нейросеть

Краткий ответ:

  1. \(S=19\).
  2. \(S=15\) и \(S=18\), ответ без разделителей: 1518.
  3. Максимальное значение \(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
напиши ответ с решением (программой)
**Краткий ответ:** 1. \(S=19\). 2. \(S=15\) и \(S=18\), ответ без разделителей: **1518**. 3. Максимальное значение \(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 ```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)) ``` Вывод программы: ```text 1) [19] 2) 1518 3) 17 ```