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

На чис­ло­вой пря­мой даны три от­рез­ка: P  =  [153 697; 780 411], Q  =  [275 071; 904 082], R  =  [722 050; 984 086].

Ука­жи­те наи­мень­шую воз­мож­ную длину та­ко­го от­рез­ка A, для ко­то­ро­го ло­ги­че­ское вы­ра­же­ние

(¬(x ∈ A)) → (((xP) ≡ (xQ)) → ((x ∈ R) ≡ (x ∈ Q))).

ис­тин­но (т. е. при­ни­ма­ет зна­че­ние 1) при любом зна­че­нии пе­ре­мен­ной x.

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

Ре­ше­ние.

Вве­дем обо­зна­че­ния:

(xА) ≡ A; (xP) ≡ P; (xQ) ≡ Q ;(xR) ≡ R.

При­ме­нив пре­об­ра­зо­ва­ние им­пли­ка­ции, по­лу­ча­ем:

¬A → ((P ≡ Q) →(R ≡ Q)) =A ∨ ((P ≡ Q) →(R ≡ Q)) .

Ло­ги­че­ское ИЛИ ис­тин­но, если ис­тин­но хотя бы одно утвер­жде­ние. Не­об­хо­ди­мо найти такой про­ме­жу­ток А, где вы­ра­же­ние

((P ≡ Q) →(R ≡ Q)) ложно. Им­пли­ка­ция ложно толь­ко в одном слу­чае, когда пер­вое вы­ска­зы­ва­ние ис­ти­на. а вто­рое вы­ска­зы­ва­ние ложно.

Вы­ра­же­ние (P ≡ Q) ис­тин­но на мно­же­стве (−∞, 153 697] ∪ [275 071, 780 411] ∪ [ 904 082, +∞).

Вы­ра­же­ние (R ≡ Q) ложно на мно­же­стве [275 071, 722 050] ∪ [ 904 082,  984 086].

Вы­ра­же­ние ((P ≡ Q) →(R ≡ Q)) ложно на мно­же­стве [275 071, 722 050] ∪ [ 904 082,  984 086]. Сле­до­ва­тель­но, А долж­но быть ис­тин­но на этом про­ме­жут­ке. Тогда ми­ни­маль­ная длин­на А равна  984 086-275 071=709015.

 

Ответ: 709015.

 

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

P=153697,780411;Q=275071,904082;R=722050,984086

def f(x):return ((P[0]<=x<=P[1])==(Q[0]<=x<=Q[1]))<=((R[0]<=x<=R[1])==(Q[0]<=x<=Q[1]))

bad=[x for x in range(P[0],R[1]+1) if not f(x)]

print(max(bad)-min(bad))

 

При­ведём ре­ше­ние Да­ни­ла Лу­ки­ных на языке Python.

За­ко­ди­ру­ем гра­ни­цы диа­па­зо­нов так, чтобы мак­си­маль­но сузить круг пе­ре­би­ра­е­мых зна­че­ний, сле­дуя сле­ду­ю­щим пра­ви­лам:

1)  Если между двумя со­сед­ни­ми гра­ни­ца­ми диа­па­зо­нов не было це­ло­чис­лен­ных точек, то и в за­ко­ди­ро­ван­ном виде между чис­ла­ми не долж­но быть точек

1.1) Иначе, если точка была одна, то ана­ло­гич­но одна точка долж­на быть и между за­ко­ди­ро­ван­ны­ми гра­ни­ца­ми

1.2) Иначе, если точек было 2 и более, нужно оста­вить 2 точки между за­ко­ди­ро­ван­ны­ми гра­ни­ца­ми.

Про­ведём ко­ди­ров­ку, для этого рас­по­ло­жим гра­ни­цы в по­ряд­ке воз­рас­та­ния и под­берём для них зна­че­ния, в со­от­вет­ствие с пра­ви­ла­ми:

153 697 - 1

275 071 - 4

722 050 - 7

780 411 - 10

904 082 - 13

984 086 - 16

Так как между всеми гра­ни­ца­ми было более 2-х точек, в за­ко­ди­ро­ван­ном виде между чис­ла­ми мы также оста­ви­ли по 2 точки.

Те­перь на­пи­шем про­грам­му для пе­ре­бо­ра всех воз­мож­ных зна­че­ний про­ме­жут­ка A в диа­па­зо­нах от -1 до 18(вклю­чи­тель­но), а для x, в свою оче­редь от -2 до 19(вклю­чи­тель­но).

a1_res = 0

a2_res = 0

min_len = -1

for a1 in range(-1, 19):

for a2 in range(a1, 19):

flag = True

for x in range(-2, 20):

flag = (not (a1 <= x <= a2)) <= (((1 <= x <= 10) == (4 <= x <= 13)) <= ((7 <= x <= 16) == (4 <= x <= 13)))

if not flag:

break

if flag and (a2 - a1 < min_len or min_len == -1):

a1_res = a1

a2_res = a2

min_len = a2 - a1

print(a1_res, a2_res)

Про­грам­ма вы­да­ла два зна­че­ния: 4 и 16. Пе­ре­ведём коды об­рат­но в зна­че­ния гра­ниц и вы­чис­лим по­лу­чен­ную длину про­ме­жут­ка A.

984 086 - 275 071 = 709 015