15.04 Побитовая конъюнкция
Ошибка.
Попробуйте повторить позже
Обозначим через поразрядную конъюнкцию неотрицательных целых чисел
и
.
Так, например, .
Для какого наибольшего целого числа формула
тождественно истинна (т. е. принимает значение 1 при любом неотрицательном целом значении переменной
)?
Решение руками
Для начала упростим данное выражение:
Раскроем отрицания:
Отделим скобками известную часть выражения от части с :
Сделаем отрицание известной части, чтобы найти те значения , которые будут давать истину для отрицания. Тогда
они будут обязаны выполняться для условия с
:
Выпишем поразрядную конъюнкцию :
Значит для истинности отрицания числа должны в двоичном виде принимать вид
, где x – любая
цифра.
Теперь выпишем поразрядную конъюнкцию с учётом известных цифр в числах
:
Условие выполнится, если цифра a будет равна 0. Значит двоичная запись чисел
, которые делают
отрицание истинным, имеет следующий вид:
, где x - любая цифра. Чтобы условие условие
было
истинным нужно, чтобы двоичная запись числа
имела вид
. Тогда при поразрядной конъюнкции с любым
числом
в результате будет 0. Значит наибольшее число
имеет значение
. Ответ
.
Программное решение
Для нахождения наибольшего целого числа , при котором выражение
тождественно истинно для всех неотрицательных , используем программный перебор. Идея заключается в том, чтобы
проверить все значения
от 0 до 999. Для каждого
перебираем все значения
от 0 до 9999 и проверяем
истинность формулы. Если хотя бы для одного
формула ложна, текущее
отбрасываем. Если формула
истинна для всех
, обновляем максимум и продолжаем перебор. В конце выводим наибольшее подходящее
.
# переменная для хранения наибольшего подходящего A ans = 0 # перебор возможных значений A от 0 до 999 for a in range(1000): # флаг: True - формула выполняется для всех x, False - хотя бы один случай нарушает flag = True # перебор всех значений x от 0 до 9999 for x in range(10000): # проверка истинности формулы для текущего x и a if ((not (x & a != 0)) or (not (x & 122 == 0)) or (x & 144 != 0)) == False: flag = False break # если формула выполняется для всех x, обновляем максимум if flag == True: ans = max(ans, a) # выводим наибольшее подходящее A print(ans)
Специальные программы

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

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

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

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

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

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