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

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

Так, на­при­мер, 14 & 5  =  11102 & 01012  =  01002  =  4. Для ка­ко­го наи­мень­ше­го не­от­ри­ца­тель­но­го це­ло­го числа А фор­му­ла

x & 29 ≠ 0 → (x & 17 = 0 → x & А ≠ 0)

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

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

Ре­ше­ние.

При­ве­дем ана­ли­ти­че­ское ре­ше­ние Юрия Кра­силь­ни­ко­ва.

Пре­об­ра­зу­ем ис­ход­ное вы­ра­же­ние x & 29 ≠ 0 → (x & 17 = 0 → x & А ≠ 0),

ис­клю­чив им­пли­ка­цию: (x & 29 = 0) ∨ (x & 17 ≠ 0) ∨ (x & А ≠ 0).

Число 29 в дво­ич­ном пред­став­ле­нии  — это 11101.

Если число x не со­дер­жит еди­ниц в раз­ря­дах 0, 2, 3 и 4, то вы­ра­же­ние (x & 29  =  0) будет ис­тин­но, а зна­чит, ис­тин­ной будет и вся фор­му­ла. (Раз­ря­ды счи­та­ем спра­ва на­ле­во, на­чи­ная с нуля.)

С дру­гой сто­ро­ны, если еди­ни­цы будут в раз­ря­дах числа 17 (дво­ич­ное 10001), то есть в раз­ря­дах 0 и 4, то вы­ра­же­ние (x & 17 ≠ 0) и вся фор­му­ла будут ис­тин­ны.

Сле­до­ва­тель­но, два левых вы­ра­же­ния будут лож­ны­ми, если в числе x есть еди­ни­цы в раз­ря­дах, ко­то­рые есть в числе 29, но ко­то­рых нет в числе 17, то есть в раз­ря­дах 2 и 3. В таком слу­чае долж­но быть ис­тин­ным вы­ра­же­ние (x & А ≠ 0). По­это­му число A долж­но обя­за­тель­но со­дер­жать еди­ни­цы в раз­ря­дах 2 и 3. Это число в дво­ич­ной за­пи­си  — 1100, в де­ся­тич­ной  — 12.

 

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

var

A, x: integer;

B: boolean;

begin

for A := 0 to 32 do begin

B := True;

for x := 0 to 32 do

if not (((x and 29) = 0) or ((x and 17) <> 0) or ((x and A) <> 0)) then

B := False;

if B then begin

writeln(A);

break;

end;

end;

end.

 

Ответ: 12.

 

При­ве­дем ана­ло­гич­ную про­грам­му на языке Python (Вла­ди­мир Юрье­вич Ламок).

ok=1

A=set()

for a in range (1, 65):

   ok=1

   for x in range (0, 65):

      if ((x & 29 != 0) <= ((x & 17 == 0) <= (x & a != 0))) == 0:

         ok=0

   if ok:

      A.add(a)

      break

print(min(A))

 

За­ме­тим, что можно было пе­ре­би­рать числа не до 64, а до 32, по­сколь­ку пред­став­ля­ют ин­те­рес толь­ко биты, ко­то­рые могут быть уста­нов­ле­ны в чис­лах 29 и 17.

 

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

for A in range(0, 1000):

flag = True

for x in range(1000):

f = (x & 29 != 0) <= ((x & 17 == 0) <= (x & A != 0))

if not(f):

flag = False

break

if flag:

print(A)

break

 

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

for a in range(0, 1000):

k = 0

for x in range(0, 1000):

if (x & 29 != 0) <= ((x & 17 == 0) <= (x & a != 0)):

k += 1

if k == 1000:

print(a)

break

 

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

def F(x, A):

return (x & 29 != 0) <= ((x & 17 == 0) <= (x & A != 0))

for A in range(0, 1000):

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

print(A)

break


Аналоги к заданию № 9804: 34506 34508 34510 ... Все

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