Другие языки программирования и технологии

Информатика ЕГЭ, Задание 15 в Pascal.

 Обозначим через m & n поразрядную конъюнкцию неотрицательных целых чисел m и n. Так, например, 14 & 5 = 11102& 01012 = 01002 = 4. 
Для какого наименьшего неотрицательного целого числа А формула

((x & 52 ≠ 0) /\ (x & 36 = 0)) → ¬ (x & А = 0)

тождественно истинна (т.е. принимает значение 1) при любом неотрицательном целом значении переменной х?
пишу следующую программу:
##
function f(x, a: integer):=(((x and 52)<>0)and ((x and 36)=0))>= not((x and a)=0);
foreach var a in 0..1000 do
if (0..1000).All(x->f(x,a)) then println(a);

выдаёт соответственно в ответе 0.
в чём я допускаю ошибку???
DA
Dark Angel =)
138
Для начала приведи выражение к ДНФ и избавься от двойных отрицаний:
 ¬(((x & 52) ≠ 0) ∧ ((x & 36) = 0)) ∨ ¬((x & A) = 0)  =
= ¬((x & 52) ≠ 0) ∨ ¬((x & 36) = 0) ∨ ¬((x & A) = 0) =
= ((x & 52) = 0) ∨ ((x & 36) ≠ 0) ∨ ((x & A) ≠ 0) =
= ((x & 52) = 0) ∨ ((x & (36 | A)) ≠ 0)
Вертикальная черта - это побитовое "ИЛИ".
Первое слагаемое ложно, когда в x присутствует любой из единичных битов числа 52. В этих случаях второе слагаемое должно быть истинным. Но 36 является битовым подмножеством 52-х (отличается только четвёртым битом, соответствующим числу 16), поэтому если (x & 52) ≠ 0, то (x & 36) может быть = 0 только при (x & 16) = 16, и только тогда всё выражение будет ложным. Именно этот 4-й бит и должна добавить маска A, чтобы устранить возможность сделать выражение ложным.
 (A & 16) = 16 
наименьшим неотрицательным числом, для которого это верно, является
 A = 16 
т.к добавление единичного бита в любой позиции сделает нам большее число, чем 16.

--------
А в твоём коде ошибка - в записи импликации. Из ложного утверждения следует всё, что угодно, а из истинного может следовать только истина. Т.е. посылка меньше или равна следствию.
Например, выражение "если чатгптшный ответ от бота МИНИСТРЕЛИЯ правильный, то я - президент США" истинно, хоть я и не президент США, и вообще не могу им стать по конституции США. Но поскольку посылка ложна, никакие утверждения следствия не могут нарушить истинность всей импликации.
Поэтому поменяй >= на <=.
РА
Рашид Абитаев
54 053
Лучший ответ
Dark Angel =) Спасибо огромное!!
В том что выбрал паскаль для ЕГЭ
Денис Корнеев ты что, совсем ку-ку, ели в школе Паскаль, что делать ученику
Отдел Занятости И Социальных Программ Ко Я за 1 месяц лета выучил питон
Отдел Занятости И Социальных Программ Ко Ну ладно, дело твое. С паскалем один геморрой
В вашей программе вы проверяете условие ((x & 52 ≠ 0) /\ (x & 36 = 0)) → ¬ (x & А = 0) для всех значений переменной x в диапазоне от 0 до 1000 и для каждого значения a в диапазоне от 0 до 1000. Если для всех значений x условие выполняется, то выводится значение a.

Однако, для решения данной задачи, вам нужно найти наименьшее значение a, при котором условие тождественно истинно для всех значений x.

Ошибка в вашем подходе заключается в том, что вы перебираете все возможные значения a в диапазоне от 0 до 1000, что может быть излишне и занимать много времени. Вместо этого, можно применить логику и анализировать условие более эффективно.

Давайте проанализируем условие ((x & 52 ≠ 0) /\ (x & 36 = 0)) → ¬ (x & А = 0) поэтапно:

Пусть x & 52 ≠ 0. Это означает, что в числе x присутствуют биты, которые равны 1 в числе 52. Такие биты находятся в позициях, где у числа 52 есть единицы, а у числа 36 нули.

Пусть x & 36 = 0. Это означает, что в числе x все биты, которые равны 1 в числе 36, также равны 0.

Если оба этих условия выполняются, то мы проверяем, что x & А ≠ 0. Это означает, что в числе x есть биты, которые равны 1 в числе А.

Теперь мы должны найти наименьшее значение А, при котором условие тождественно истинно для всех значений x.

Анализируя биты чисел 52 и 36, можно заметить, что биты 52, которые равны 1, также равны 1 в числе 36. Поэтому, чтобы удовлетворить условиям 1 и 2, в числе x должны быть нули в позициях, где в числе 52 есть единицы.

Таким образом, чтобы условие ((x & 52 ≠ 0) /\ (x & 36 = 0)) → ¬ (x & А = 0) было тождественно истинно, число А должно иметь единицы в тех же позициях, где в числе 52 есть нули.

Поскольку в числе 52 только 6 значащих битов, вам нужно найти наименьшее число А, у которого эти 6 битов равны 1. Это означает, что наименьшее значение А равно 63 (111111₂).


Для нахождения наименьшего значения А, удовлетворяющего условию ((x & 52 ≠ 0) /\ (x & 36 = 0)) → ¬ (x & А = 0) для любого неотрицательного целого значения x, вы можете использовать следующий код на языке Python:
 x = 0 
A = 0

while True:
if (x & 52 != 0) and (x & 36 == 0):
if (x & A == 0):
break
A += 1
x += 1

print(A)
Рашид Абитаев Восхитительный бред.