Преобразуем (X & A ≠ 0) → ((X & 12 = 0) → (X & 49 ≠ 0)), избавившись от импликации. Для этого используем замену a→b = ¬a ∨ b
Также учтем, что ¬(p=0) = p≠0
Получаем (X & A = 0) ∨((X & 12 ≠ 0) ∨ (X & 49 ≠ 0))
Можно раскрыть скобки (X & A = 0) ∨ (X & 12 ≠ 0) ∨ (X & 49 ≠ 0)
49₁₀ = 110001₂, 12₁₀ = 001100₂, тогда
(X & A = 0) ∨ (X & 001100 ≠ 0) ∨ (X & 110001 ≠ 0)
Чтобы результат поразрядной конъюнкции был ненулевым, нужно чтобы в обоих операндах совпадали единичные биты хотя бы в одном разряде.
В нашем случае есть три члена, связанные по "ИЛИ" и задача - определить, при каком А выражение всегда будет истинным, т.е. даст хотя бы один единичный бит. Понятно, что значение А влияет только на тот случай, когда нули дали и (X & 001100 ≠ 0), и (X & 110001 ≠ 0).
Когда же такое возможно?
X & 001100 = 0, если Х имеет вид ??00??, где ? - произвольное состояние бита.
X & 110001 = 0, если Х имеет вид 00???0.
Объединяя эти два случаю получаем, при Х=0000?0 выражение
(X & 001100 ≠ 0) ∨ (X & 110001 ≠ 0) даст нули во всех битах.
Тогда (X & A = 0) должно дать хотя бы один единичный бит.
Получаем 0000?0 & А = 0, следовательно, А может иметь вид ????0?.
Тогда максимальное значение А равно 111101₂ = 61₁₀
Вместо переменных A и B нужно подставить нули и единицы, всего в данном случае возможно 4 различных комбинации (A=0 и B=0; A=0 и B=1; A=1 и B=0; A=1 и B=1).
Для простоты понимания знак «ᴠ» можно представить как знак сложения «+», знак «&» как знак умножения «*», а черточка над знаком обозначает отрицание, т.е. противоположное значение ( отрицание нуля равно единице, отрицание единицы равно нулю).
Таким образом можно преобразовать выражение. Например, под буквой Б вместо A&(AvB) записать A*(A+B) и начать подставлять нули и единицы и заполнять таблицу:
A B AvB ( или A+B) A&(AvB) ( или A*(A+B) )
0 0 0 0
0 1 1 0
1 0 1 1
1 1 1 1
Под остальными буквами порядок действий проставлен правильно и действовать нужно по аналогии.
Program aaa;
var A,B: array[1..4,1..4] of integer; i,j,x: byte;
begin
randomize; //запускаем генератор случайных чисел
// формируем и одновременно выводим матрицу
writeln ('Исходная матрица:');
for i:=1 to 4 do
begin
for j:=1 to 4 do
begin
A[i,j]:=random(-10,10); //рандомное значение ячейки матрицы
write(A[i,j]:4) //вывод ячейки матрицы
end;
writeln;
end;
//поворачиваем матрицу на 90 градусов
for j:=1 to 4 do
begin
x:=0;
for i:=4 downto 1 do
begin
x:=x+1;
B[j,x]:=A[i,j]
end
end;
// выводим итоговую матрицу
writeln;
writeln ('Матрица, повернутая на 90 градусов:');
for i:=1 to 4 do
begin
for j:=1 to 4 do
write(B[i,j]:4);
writeln
end
end.
--------------------------------------------------
Результат работы программы:
Исходная матрица:
-7 -8 3 4
10 -5 -1 -8
3 -9 -7 -1
-2 6 -8 -9
Матрица, повернутая на 90 градусов:
-2 3 10 -7
6 -9 -5 -8
-8 -7 -1 3
-9 -1 -8 4
Program MyProject;
{$APPTYPE CONSOLE}
var
p:int64;
a:integer;
i:2..10;
begin
a:=1+2;
p:=a;
i:=2;
while i<10 do begin
i:=i+1;
a:=a+i;
p:=p*a;
end;
Write(p)
end.