Загрузка данных
```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