Загрузка данных


```python
import sys

# ------------------------------------------------------------
# Задача 4
# ------------------------------------------------------------
def task4(filename="sequence.txt"):
    """
    Читает последовательность чисел из файла.
    Возвращает количество искомых пар и минимальную сумму элементов в таких парах.
    """
    try:
        with open(filename, 'r') as f:
            # Читаем все числа из файла (разделены пробелами или переводами строк)
            data = list(map(int, f.read().split()))
    except FileNotFoundError:
        print(f"Файл {filename} не найден.")
        return None, None

    if len(data) < 2:
        return 0, 0   # нет пар

    min_val = min(data)
    # Если минимальный элемент больше 54, остаток от деления на 55 не может быть равен ему
    if min_val > 54:
        return 0, 0

    count = 0
    min_sum = float('inf')
    for i in range(len(data) - 1):
        a, b = data[i], data[i+1]
        if (a % 55 == min_val) or (b % 55 == min_val):
            count += 1
            s = a + b
            if s < min_sum:
                min_sum = s

    if count == 0:
        return 0, 0
    return count, min_sum


# ------------------------------------------------------------
# Задачи 5-7 (игра)
# ------------------------------------------------------------
def game_analysis():
    """
    Анализирует игру для всех начальных S от 1 до 54.
    Возвращает:
        win[S] - выигрышна ли позиция для текущего игрока,
        one_win[S] - можно ли выиграть одним ходом из S.
    """
    win = [False] * 55          # win[S] для S от 0 до 54, 0 не используется
    one_win = [False] * 55

    # Вычисляем one_win и win снизу вверх (от 54 до 1)
    for pos in range(54, 0, -1):
        # Проверяем выигрыш одним ходом
        if pos + 1 >= 55 or pos + 4 >= 55 or pos * 3 >= 55:
            one_win[pos] = True
        else:
            one_win[pos] = False

        # Определяем выигрышность позиции
        # Если есть ход, приводящий к проигрышу противника, то позиция выигрышная
        # Иначе проигрышная
        win[pos] = False
        # Ходы: +1, +4, *3
        moves = []
        if pos + 1 < 55:
            moves.append(pos + 1)
        if pos + 4 < 55:
            moves.append(pos + 4)
        if pos * 3 < 55:
            moves.append(pos * 3)
        # Если можно выиграть сразу, то позиция выигрышная
        if one_win[pos]:
            win[pos] = True
        else:
            # Ищем ход в проигрышную позицию
            for nxt in moves:
                if not win[nxt]:
                    win[pos] = True
                    break
    return win, one_win


def task5(win, one_win):
    """
    Минимальное S, при котором:
        - Петя не может выиграть за один ход,
        - при любом ходе Пети Ваня может выиграть своим первым ходом.
    """
    candidates = []
    for S in range(1, 55):
        if one_win[S]:          # Петя выигрывает первым ходом – не подходит
            continue
        # Все ходы Пети (которые не приводят к немедленной победе, но таких и нет,
        # т.к. one_win[S]=False). Получаем позиции, куда может пойти Петя.
        moves = []
        if S + 1 < 55:
            moves.append(S + 1)
        if S + 4 < 55:
            moves.append(S + 4)
        if S * 3 < 55:
            moves.append(S * 3)
        # Проверяем, что из любой такой позиции Ваня выигрывает одним ходом
        if all(one_win[nxt] for nxt in moves):
            candidates.append(S)
    return min(candidates) if candidates else None


def task6(win, one_win):
    """
    Два наименьших S, при которых:
        - Петя не может выиграть за один ход,
        - Петя может выиграть своим вторым ходом (независимо от ходов Вани).
    """
    candidates = []
    for S in range(1, 55):
        if one_win[S]:
            continue
        # Перебираем возможные ходы Пети
        for move in (S+1, S+4, S*3):
            if move >= 55:
                continue
            S1 = move
            # Ваня не должен выиграть первым ходом
            if one_win[S1]:
                continue
            # Проверяем все ответы Вани
            valid = True
            for vmove in (S1+1, S1+4, S1*3):
                if vmove >= 55:
                    valid = False   # Ваня выигрывает сразу – недопустимо
                    break
                S2 = vmove
                # Петя должен выиграть одним ходом из S2
                if not one_win[S2]:
                    valid = False
                    break
            if valid:
                candidates.append(S)
                break   # нашли подходящий ход для этого S
    candidates = sorted(set(candidates))
    # Берём два наименьших (если их меньше двух, то берём сколько есть)
    return candidates[:2] if candidates else []


def task7(win, one_win):
    """
    Минимальное S, при котором:
        - у Вани есть выигрышная стратегия (т.е. позиция проигрышная для Пети),
        - Ваня может выиграть первым или вторым ходом, но не может выиграть первым ходом гарантированно.
    """
    candidates = []
    for S in range(1, 55):
        if win[S]:          # Петя выигрывает – не подходит
            continue
        # Проверяем: существует ли ход Пети, из которого Ваня НЕ может выиграть первым ходом?
        found = False
        for move in (S+1, S+4, S*3):
            if move >= 55:
                continue
            if not one_win[move]:
                found = True
                break
        if found:
            candidates.append(S)
    return min(candidates) if candidates else None


# ------------------------------------------------------------
# Основная часть: вывод результатов
# ------------------------------------------------------------
if __name__ == "__main__":
    # Задача 4
    cnt, min_sum = task4("task4.txt")   # измените имя файла при необходимости
    print(f"Задача 4: {cnt} {min_sum}")

    # Задачи 5-7
    win, one_win = game_analysis()

    ans5 = task5(win, one_win)
    print(f"Задача 5: {ans5}")

    ans6 = task6(win, one_win)
    print(f"Задача 6: {' '.join(map(str, ans6))}")

    ans7 = task7(win, one_win)
    print(f"Задача 7: {ans7}")
```
https://b6.csdnevnik.ru/85af2f4e5c0440509920092cdf8efa02.txt