Обозначим через m&n поразрядную конъюнкцию неотрицательных целых
Так, например, 14&5 = 11102&01012 = 01002 = 4.
Для какого наибольшего целого
x&51 = 0 ∨ (x&41 = 0 → x&А = 0)
тождественно истинна (т. е. принимает
Преобразуем выражение по законам алгебры логики:
Далее применяем обозначения и реализуем способ решения, изложенный К. Ю. Поляковым в теоретических материалах (см., например, раздел «Теория» на нашем сайте), без дополнительных пояснений.
Заметим, что первое слагаемое логической суммы является импликацией
Действительно, например, для х = 2 поразрядная конъюнкция
2: 000010
41: 101001
2&41: 000000, то есть 2&41 = 0. Высказывание 2&41 = 0 истинно.
2: 000010
51: 110011
2&51: 000010 = 2, то есть 2&51 = 2. Высказывание 2&51 = 0 ложно.
Итак, импликация
Таким образом, наибольшее А = 1010012 = 4110.
Ответ: 41.
Примечание.
Ответ 45 не подходит. Пусть A = 45, а x = 2210 = 101102, тогда:
51: 1100112
22: 0101102
51&22: 0100102, то есть высказывание 22&51 = 0 ложно;
41: 1010012
22: 0101102
41&22: 0000002, то есть высказывание 22&41 ≠ 0 ложно;
45: 1011012
22: 0101102
51&22: 0001002, то есть высказывание 22&45 = 0 ложно.
Следовательно, при x = 22 и A = 45 логическое выражение ложно.
Приведем другое решение.
Выражение
Выражение x&51 = 0 будет ложно, поскольку и
Следовательно, истинной должна быть импликация во второй скобке. Но левая часть импликации x&41 = 0 истинна, поскольку ни один из битов, установленных
Тогда истинной должна быть и правая часть импликации x&А = 0. Следовательно,
При таком А левая и правая части импликации одинаковы. Следовательно, импликация в правой скобке истинна, а значит, истинно и все выражение.
Приведём другое решение.
Решим задание с помощью языка программирования PascalABC методом перебора:
var
A, x: integer;
B: boolean;
begin
for A := 0 to 63 do begin
B := True;
for x := 0 to 63 do
if not (((x and 51) = 0) or ((x and 41) <> 0) or ((x and (63-A)) = 0)) then
B := False;
if B then begin
writeln((63-A));
break;
end;
end;
end.
Приведём другое решение на языке Python.
for A in range(64):
B = True
for x in range(64):
if ((x&51==0) or (x&41!=0) or (x&(63-A)==0))==0:
B=False
if B:
print(63-A)
break
Заметим, что можно не перебирать числа,
Ответ: 41.
Приведём другое решение на языке Python.
for a in range(100, 0, -1):
k = 0
for x in range(100, 0, -1):
if (x & 51 == 0) or (not(x & 41 == 0) or (x & a == 0)):
k += 1
if k == 100:
print(a)
break
Приведём решение Ильи Андрианова на языке Python.
def F(x, A):
return (x&51 == 0) or ((x&41 == 0) <= (x&A == 0))
R = []
for A in range(0, 10_000):
if all(F(x, A) for x in range(0, 10_000)):
R.append(A)
print(max(R))

