15.04 Побитовая конъюнкция
Ошибка.
Попробуйте повторить позже
Обозначим через поразрядную конъюнкцию неотрицательных целых чисел
и
Так, например,
Для какого наименьшего целого числа формула
тождественно истинна (т. е. принимает значение 1 при любом неотрицательном целом значении переменной
Решение аналитикой
Для начала упростим данное выражение:
Отделим скобками известную часть выражения от части с :
Сделаем отрицание известной части, чтобы найти те значения , которые будут давать истину для отрицания. Тогда
они будут обязаны выполняться для условия с
:
Выпишем поразрядную конъюнкцию :
Значит для истинности отрицания числа должны в двоичном виде принимать вид
, где x – любая
цифра.
Теперь выпишем поразрядную конъюнкцию с учётом известных цифр в числах
:
Условие выполнится, если хотя бы одна цифра на месте
будет равна 1. Значит в числах
обязательно
должна быть единица в 0 и/или 4 разряде. Выпишем числа
, которые дают истину для отрицания известной части:
,
,
.
Для всех таких чисел должно быть истинным условие
. Значит, двоичная запись числа
обязательно должна иметь вид
, чтобы при поразрядной конъюнкции с любым числом
получался
в результате хотя бы один разряд 1. Значит наименьшее число
имеет значение
. Ответ
.
Идея решения:
Перебираем целые неотрицательные с помощью цикла for, начиная с малых значений, чтобы найти наименьшее.
Для каждого
проверяем тождественную истинность
для всех неотрицательных , используя вложенный цикл for. Для проверки поразрядной конъюнкции применяем
оператор &. Если найдётся хотя бы одно
, при котором формула ложна, сбрасываем цикл и текущее
не подходит.
Первое
, для которого формула истинна для всех
, будет искомым наименьшим.
Решение программой:
# Функция проверки тождественной истинности формулы для заданного A def f(a): # Перебор всех неотрицательных x for x in range(1, 1000): # Проверяем формулу с использованием поразрядной конъюнкции if ((x & 38 == 0) <= ((x & 55 != 0) <= (x & a != 0))) == 0: # Сбрасываем цикл, данное A не подходит return False # Формула истинна для всех x return True # Перебор возможных значений A для нахождения наименьшего for a in range(1, 1000): if f(a): print(a) break
Специальные программы

Программа
лояльности v2.0
Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!
Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение
Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты
Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей
Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ
Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!