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

Обо­зна­чим через m&n по­раз­ряд­ную конъ­юнк­цию не­от­ри­ца­тель­ных целых чисел m и n. Так, на­при­мер, 12&6  =  11002&01102  =  01002  =  4.

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

х&А не равно 0 → (x&36 = 0 → х&6 не равно 0)

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

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

Ре­ше­ние.

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

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

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

Имеем им­пли­ка­цию Z36Z6 → ZA или Z(36 or 6) → ZA. За­пи­шем числа 36 и 6 в дво­ич­ной си­сте­ме счис­ле­ния: 3610  =  1001002, 610  =  1102, най­дем по­би­то­вую дизъ­юнк­цию: 100110. Еди­нич­ные биты, сто­я­щие в пра­вой части, долж­ны яв­лять­ся еди­нич­ны­ми би­та­ми левой. По­это­му в пра­вой части еди­нич­ны­ми би­та­ми не­за­ви­си­мо друг от друга могут быть (а могут не быть) толь­ко пер­вый, вто­рой или пятый биты (как обыч­но, счи­тая спра­ва на­ле­во, на­чи­ная с нуля).

Таким об­ра­зом, наи­боль­шее А  =  1001102  =  3810.

 

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

Решим за­да­ние с по­мо­щью языка про­грам­ми­ро­ва­ния PascalABC ме­то­дом пе­ре­бо­ра:

var

A, x: integer;

B: boolean;

begin

for A := 63 downto 0 do begin

B := True;

for x := 0 to 63 do

if not (((x and 6) <> 0) or ((x and 36) <> 0) or ((x and A) = 0)) then

B := False;

if B then begin

writeln(A);

break;

end;

end;

end.

 

При­ведём дру­гое ре­ше­ние на языке Python.

for A in range(63,0,-1):

B = True

for x in range(63):

if ((x&A==0) or (x&36!=0) or (x&6!=0))==0:

B=False

if B:

print(A)

break

 

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

 

Ответ: 38.

 

При­ведём ре­ше­ние Ильи Ан­дри­а­но­ва на языке Python.

def F(x, A):

return (x & A != 0) <= ((x & 36 == 0) <= (x & 6 != 0))

for A in range(1000, 0, -1):

if all(F(x, A) for x in range(1, 10000)):

print(A)

break


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

Раздел кодификатора ФИПИ: 1.5.1 Вы­ска­зы­ва­ния, ло­ги­че­ские опе­ра­ции, кван­то­ры, ис­тин­ность вы­ска­зы­ва­ния