Задания
Версия для печати и копирования в MS Word
Тип 15 № 34521
i

Обо­зна­чим через m&n по­раз­ряд­ную конъ­юнк­цию не­от­ри­ца­тель­ных целых чисел m и n.

Так, на­при­мер, 14&5  =  11102&01012  =  01002  =  4.

Для ка­ко­го наи­боль­ше­го це­ло­го числа А фор­му­ла

x&51 = 0 ∨ (x&41 = 0 → x&А = 0)

тож­де­ствен­но ис­тин­на (т. е. при­ни­ма­ет зна­че­ние 1 при любом не­от­ри­ца­тель­ном целом зна­че­нии пе­ре­мен­ной x)?

Спрятать решение

Ре­ше­ние.

Пре­об­ра­зу­ем вы­ра­же­ние по за­ко­нам ал­геб­ры ло­ги­ки:

Х + (Y → Z) = Х + (¬Y + Z) = Х + Z + ¬Y = Y → (X + Z) = (Y → X) + (Y → Z).

Далее при­ме­ня­ем обо­зна­че­ния и ре­а­ли­зу­ем спо­соб ре­ше­ния, из­ло­жен­ный К. Ю. По­ля­ко­вым в тео­ре­ти­че­ских ма­те­ри­а­лах (см., на­при­мер, раз­дел «Тео­рия» на нашем сайте), без до­пол­ни­тель­ных по­яс­не­ний.

За­ме­тим, что пер­вое сла­га­е­мое ло­ги­че­ской суммы яв­ля­ет­ся им­пли­ка­ци­ей Z41 → Z51, ко­то­рая не яв­ля­ет­ся ис­тин­ной для всех х (см. ниже). Тогда не­об­хо­ди­мо и до­ста­точ­но, чтобы вто­рое сла­га­е­мое ло­ги­че­ской суммы было тож­де­ствен­но ис­тин­ным.

Дей­стви­тель­но, на­при­мер, для х  =  2 по­раз­ряд­ная конъ­юнк­ция с чис­лом 41 дает 0, а с чис­лом 51 дает 2. По­это­му им­пли­ка­ция (2&41) → (2&51) при­ни­ма­ет вид 1 → 0  — ложь.

 

 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 ложно.

 

Итак, им­пли­ка­ция Z41 → ZA долж­на быть тож­де­ствен­но ис­тин­ной. За­пи­шем число 41 в дво­ич­ной си­сте­ме счис­ле­ния: 4110  =  1010012. Еди­нич­ные биты, сто­я­щие в пра­вой части, долж­ны яв­лять­ся еди­нич­ны­ми би­та­ми левой. По­это­му в пра­вой части еди­нич­ны­ми би­та­ми не­за­ви­си­мо друг от друга могут быть (а могут не быть) толь­ко ну­ле­вой, тре­тий и пятый биты (как обыч­но, счи­тая спра­ва на­ле­во, на­чи­ная с нуля).

Таким об­ра­зом, наи­боль­шее А  =  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) долж­но быть ис­тин­ным для лю­бо­го х. Возь­мем такое х, в ко­то­ром уста­нов­ле­ны все биты, кроме тех, ко­то­рые уста­нов­ле­ны в числе 41, на­при­мер, для од­но­бай­то­во­го пред­став­ле­ния х  =  110101102.

Вы­ра­же­ние x&51  =  0 будет ложно, по­сколь­ку и в числе х, и в числе 51 уста­нов­лен пер­вый бит (биты счи­та­ем спра­ва на­ле­во, на­чи­ная с нуля).

Сле­до­ва­тель­но, ис­тин­ной долж­на быть им­пли­ка­ция во вто­рой скоб­ке. Но левая часть им­пли­ка­ции x&41  =  0 ис­тин­на, по­сколь­ку ни один из битов, уста­нов­лен­ных в числе 41, в числе х не уста­нов­лен.

Тогда ис­тин­ной долж­на быть и пра­вая часть им­пли­ка­ции x&А  =  0. Сле­до­ва­тель­но, в числе А могут быть уста­нов­ле­ны толь­ко те биты, ко­то­рые не уста­нов­ле­ны в числе х, то есть ну­ле­вой, тре­тий и пятый биты. Таким об­ра­зом, наи­боль­шее А  =  1010012  =  4110.

При таком А левая и пра­вая части им­пли­ка­ции оди­на­ко­вы. Сле­до­ва­тель­но, им­пли­ка­ция в пра­вой скоб­ке ис­тин­на, а зна­чит, ис­тин­но и все вы­ра­же­ние.

 

При­ведём дру­гое ре­ше­ние.

Решим за­да­ние с по­мо­щью языка про­грам­ми­ро­ва­ния 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

За­ме­тим, что можно не пе­ре­би­рать числа, боль­шие 63, по­сколь­ку для за­пи­си чисел 41 и 51 хва­тит шести раз­ря­дов. Про­грам­ма вы­ве­дет ответ 41.

 

Ответ: 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))


Аналоги к заданию № 34521: 34522 Все

Раздел кодификатора ФИПИ: