ЕГЭ Информатика 2021: Решение 15 задания на Python

Этот материал посвящен решению различных вариантов 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 и функций.

Что будем искать? Например,программа