Этот материал посвящен решению различных вариантов 15 задания ЕГЭ по информатике 2021 года на языке Python. Задание проверяет знания математической логики и алгебры логики. В предыдущие годы (задание 18) оно было сложнее, требуя знания законов логики и умения упрощать логические выражения. В 2021 году задание стало компьютерным, что позволяет использовать языки программирования для решения методом перебора.
Задача 1: Наименьшее целое число a
Для какого наименьшего целого числа a выражение:
(x - 30 < a) and (15 - y < a) or (x * (y + 3) > 60)
тождественно истинно (принимает значение 1) при любых целых положительных x и y?
Решение заключается в переборе целых значений a и проверке истинности выражения для различных x и y в диапазоне от 1 до 1000. Используем циклы for и флаг f для отслеживания ложных результатов:
for a in range(1, 1001):
f = True
for x in range(1, 1001):
for y in range(1, 1001):
if not ((x - 30 < a) and (15 - y < a) or (x * (y + 3) > 60)):
f = False
break
if not f:
break
if f:
print(a)
break
Условие if not f: позволяет оптимизировать перебор, прерывая его, если найдено ложное значение. Код можно сократить:
for a in range(1, 1001):
if all(((x - 30 < a) and (15 - y < a) or (x * (y + 3) > 60) for x in range(1, 1001) for y in range(1, 1001)):
print(a)
break
Ещё лучше вынести логическое выражение в отдельную функцию:
def f(x, y, a):
return (x - 30 < a) and (15 - y < a) or (x * (y + 3) > 60)
for a in range(1, 1001):
if all(f(x, y, a) for x in range(1, 1001) for y in range(1, 1001)):
print(a)
break
Результат: 15
Задача 2: Наибольшее целое число a
Укажите наибольшее целое значение a, при котором выражение:
(y + 5) * x != 80 or 3 * x > a or y > a
истинно для любых целых положительных x и y.
Решение аналогично предыдущему, за исключением того, что теперь нас интересует наибольшее значение a. Убираем инструкцию break.
def f(x, y, a):
return (y + 5) * x != 80 or 3 * x > a or y > a
last_a = 0
for a in range(1000, 0, -1): #Обратный перебор для нахождения наибольшего
if all(f(x, y, a) for x in range(1, 1001) for y in range(1, 1001)):
last_a = a
break
print(last_a)
Результат: 29
Задача 3: Наименьшее натуральное число a (поразрядная конъюнкция)
Определить наименьшее натуральное число a, такое что выражение:
(x & 13 == 0) <= ((x & 40) != 0) <= (x & a != 0)
тождественно истинно для любого натурального x. Поразрядная конъюнкция обозначается оператором &.
В этом случае переменная y отсутствует. Изменяем функцию f и убираем цикл по y.
def f(x, a):
return (x & 13 == 0) <= ((x & 40) != 0) <= (x & a != 0)
for a in range(1, 1001):
if all(f(x, a) for x in range(1, 1001)):
print(a)
break
Результат: 32
Задача 4: Наибольшее натуральное число a (делимость)
Для какого наибольшего натурального числа a формула:
not(x % a == 0) and (x % 21 == 0) <= (x % 14 != 0)
тождественно истинна при любом натуральном x?
Решаем аналогично, изменяя логическое выражение. Оператор % обозначает остаток от деления.
def f(x, a):
return not (x % a == 0) and (x % 21 == 0) <= (x % 14 != 0)
last_a = 0
for a in range(1000, 0, -1):
if all(f(x, a) for x in range(1, 1001)):
last_a = a
break
print(last_a)
Результат: 42
Задача 5: Наибольшее натуральное число a (сложное выражение)
Найти наибольшее натуральное a, для которого выражение:
(x % 3 == 0) and ((x % a == 0) <= (a * (a - 25) < 25 * (a + 200)))
истинно для любого натурального x.
Обращаем внимание на корректную расстановку скобок.
def f(x, a):
return (x % 3 == 0) and ((x % a == 0) <= (a * (a - 25) < 25 * (a + 200)))
last_a = 0
for a in range(1000, 0, -1):
if all(f(x, a) for x in range(1, 1001)):
last_a = a
break
print(last_a)
Результат: 84
Задача 6: Количество натуральных чисел a
Сколько существует натуральных значений a на отрезке от 1 до 1000 включительно, при которых формула:
(a % 9 == 0) and (280 % a == 0) <= (a % x != 0)
тождественно истинна при любом натуральном x?
Для подсчета количества значений a используем счетчик k.
k = 0
for a in range(1, 1001):
if all((a % 9 == 0) and (280 % a == 0) <= (a % x != 0) for x in range(1, 1001)):
k += 1
print(k)
Результат: 11
Задача 7: Числовые отрезки
Найти максимальную длину отрезка [a1, a2], такого что выражение:
(x in range(a1, a2 + 1)) <= ((x in range(10, 29 + 1)) or (x in range(131, 138 + 1)))
истинно для всех x. Используем перебор пар (a1, a2) и поиск максимальной разницы (a2 — a1).
max_len = 0
for a1 in range(1, 100):
for a2 in range(a1, 100):
if all(((x in range(a1, a2 + 1)) <= ((x in range(10, 30)) or (x in range(131, 139)))) for x in range(1, 200)): #расширенный диапазон для x
max_len = max(max_len, a2 - a1 + 1)
print(max_len)
Результат: 19
Приведённые примеры демонстрируют эффективное использование Python для решения заданий на логику в ЕГЭ по информатике, применяя метод полного перебора и оптимизируя код для повышения эффективности. Ключевыми моментами являются правильная запись логических выражений, использование циклов for и оптимизация с помощью break и функций.