Тип 5
Ранее мы уже разобрали алгоритм решения практически всех типов 15 заданий ЕГЭ по информатике. Остался лишь один, самый молодой, тип. Он был замечен в сборнике С.С. Крылова за 2026 год. Возможно, это просто необычный и экспериментальный тип, а возможно, задания с такой формулировкой попадутся на реальном экзамене. В любом случае мы разберём несколько примеров 15 заданий пятого типа и научимся их решать программным способом.
Задания данного типа характерны наличием фразы «множество всех натуральных делителей». В остальном же здесь присутствуют привычные нам отрезки и логическое выражение. Вот только найти здесь надо не какое-то значение числа из выражения, не длину отрезка, а число, делители которого составляют некоторое непустое множество C, фигурирующее в логическом выражении.
Ввиду того, что в таких заданиях придётся перебирать делители и работать с довольно большими числами, решать мы их будем только программным способом. Но само решение не должно у вас вызывать каких-либо трудностей, здесь будут уже привычные логические операторы Python, списочные включения с условием и всё та же функция all() для проверки истинности всех значений некоторой коллекции.
Давайте же приступим к разбору алгоритма решения пятого типа 15 заданий!
Алгоритм решения
Сразу отметим, что заданий данного типа немного, в данной статье будут представлены два примера из сборника Крылова и одно авторское задание. Начнём с такой формулировки из сборника:
«На числовой прямой дан отрезок A = [3; 60]; B – множество всех натуральных делителей числа 177, отличных от единицы и от самого числа 177; C – множество всех натуральных делителей некоторого натурального числа y, отличных от единицы и от самого числа y (число y таково, что множество C непустое). Укажите наибольшее возможное значение числа y, для которого выражение (x ∈ C) → ((x ∈ A) ∧ ¬ (x ∈ B)) истинно (т.е. принимает значение 1) при любом значении переменной x.»
Первым делом нам следует создать функцию для проверки этого логического выражения:
Сразу запишем границы отрезка A, как это делали с заданиями прошлого типа:
Теперь переходим к множеству B. По аналогии с отрезком A, мы записываем не все возможные числа из этого множества, а условие принадлежности числа к множеству. Как понять, что некоторое число x принадлежит множеству натуральных делителей числа 177 (является его делителем)?
Все просто, остаток от деления 177 на x должен равняться нулю. В Python это можно записать так: B = 177 % x == 0
Но тут важно учесть еще один момент: в условии сказано, что в это множество не входят единица и само число. Тогда давайте потребуем, чтобы x не равнялся единице и 177:
И также поступим с множеством C. Только здесь будут делители не определённого числа 177, а некоторого неизвестного y:
С этим закончили, переписываем логическую функцию из условия:
Теперь давайте перебирать значения для y. Делать это будем в цикле for, левая граница диапазона у нас будет 2 (можно подобрать и другое число, исходя из делимости чисел), а правой границей выберем какое-либо большое число, например, 10 000. Поскольку нам нужно найти наибольшее значение y, то перевернём наш диапазон срезом [::-1]:
В следующей строке будем искать делители числа y. Запись здесь стандартная: проверяем в цикле все числа от 2 до числа, на единицу большего, чем корень из y, если y делится на это число без остатка, то добавляем его в список делителей divs:
Всё, осталось проверить, что список divs не пустой (есть делители, отличные от 1 и самого числа) и что логическая функция выполняется при такой комбинации y и всех значениях x от 1 до, к примеру, 10 000:
Если это условие выполняется, то выводим текущее значение y и завершаем цикл — на этом работа программы окончена.
Давайте проверим работу нашей программы. Запускаем её и видим на экране число 2809. А это и есть ответ на данное задание!
Как и для предыдущих типов данного задания выведем шаблонный код, при условии, что A = [*1, *2], B — множество делителей числа *3:
Пример 1
Давайте по этому же алгоритму решим еще одно задание из сборника:
«На числовой прямой дан отрезок A = [7; 26]; B – множество всех натуральных делителей числа 77, отличных от единицы и от самого числа 77; C – множество всех натуральных делителей некоторого натурального числа y, отличных от единицы и от самого числа y (число y таково, что множество C непустое). Укажите наименьшее возможное значение числа y, для которого выражение (x ∈ C) → ((x ∈ A) ∧ ¬ (x ∈ B)) истинно (т.е. принимает значение 1) при любом значении переменной x.»
В функции f() меняем числа на те, которые даны в условии (логическое выражение здесь без изменений):
В данном задании требуется найти наименьшее y. Поэтому в коде далее убираем срез [::-1], оставляя всё остальное без изменений:
Запускаем нашу программу и видим результат — число 169. Его и запишем в ответ.
Пример 2
И напоследок рассмотрим задание с авторской формулировкой:
«На числовой прямой дан отрезок A = [2; 47]; B – множество всех натуральных делителей числа 69, отличных от единицы и от самого числа 69; C – множество всех натуральных делителей некоторого натурального числа y, отличных от единицы и от самого числа y (число y таково, что множество C непустое). Укажите такое значение числа y, имеющее максимальное количество делителей, для которого выражение (x ∈ C) → ((x ∈ A) ∧ ¬ (x ∈ B)) истинно (т.е. принимает значение 1) при любом значении переменной x.»
Обратите внимание, что теперь есть дополнительное условие для y. Мы ищем не просто наибольшее или наименьшее значение этого числа, а то, которое имеет максимальное количество делителей! Давайте посмотрим, как это повлияет на наш код.
Функция f() будет стандартная — меняем только числа:
Далее нам необходимо создать список res, в котором будем хранить в виде кортежей числа y и количество делителей каждого такого числа:
Три строки далее переписываем без изменений:
Но вместо вывода значения y на экран будем сохранять подходящее y и количество элементов в списке divs, то есть количество делителей числа y:
Ну а выводить мы будем то значение y, у которого больше всего делителей. Для этого применим функцию max() к списку res, которая вернёт кортеж с наибольшим значением len(divs). Чтобы вывести само число y, обратимся к элементу кортежа под индексом 1:
После запуска программы мы увидим на экране число 80. Оно и будет ответом на это задание.
Больше заданий данного типа с подробным решением вы можете найти в нашем тренажёре.
<<< Предыдущая статья Первая статья >>>