Задание 15 ЕГЭ по информатике. Логические операции

Как быстро решать задачи с выражениями вида (x∈P)∧(x∈Q), (x∈P)≡(x∈Q) и импликациями, не попадая в ловушку с краями отрезков.

Теория

Импликация U → V тожд. истинна ⇔ множество, где U истинно, целиком содержится в множестве, где V истинно: {U=1} ⊆ {V=1}.

Эквивалентность U ≡ V истинна там, где оба вместе «внутри» или оба «снаружи». На числовой прямой это объединение двух/трёх промежутков.

Края (включены/не включены): если отрезок закрытый, точка граничного значения включается в множество; открытая граница — нет. От этого зависит, можно ли «дотянуть» A до края.

Задачи на максимальную длину A и нюанс с краями

Пример 1

P = [3; 15], Q = [14; 25]. Найти наибольшую длину отрезка A, чтобы ((x∈P) ≡ (x∈Q)) → ¬(x∈A) была тожд. истинна.

Идея «в одну строчку»

Нужно, чтобы A ∩ { (x∈P)≡(x∈Q) } = ∅. Значит, A должен лежать в дополнении к области эквивалентности.

Быстрый разбор

  • (P≡Q)=1 на трёх кусках: (−∞,3), [14,15], (25,∞).
  • Дополнение: [3,14) и (15,25).
  • Из них длиннее [3,14): длина 11. Точки 14 и 15 включать нельзя (на них (P≡Q)=1), а 3 включать можно (там (P≡Q)=0: P истинно, Q ложно).

Ответ: 11.

Мини-проверка на Python (без «дробных подгонок»)

# Проверяем только «опасные точки»: границы P и Q
from math import isclose
def eqP(x): return 3 <= x <= 15
def eqQ(x): return 14 <= x <= 25
def ok(A1,A2):
    # Проверить, что на [A1,A2] не попадаем туда, где (P≡Q)=1
    # достаточно проверить концы и точки 14 и 15
    tests = [A1, A2, 14, 15]
    for t in tests:
        if A1 <= t <= A2: if (eqP(t) == eqQ(t)): # тут эквивалентность=1 — запрещено return False return True best = 0 ans = None for A1,A2 in [(3,b) for b in range(4,26)] + [(a,b) for a in range(4,26) for b in range(a+1,26)]: if ok(A1,A2): L = A2 - A1 if L > best:
            best, ans = L, (A1,A2)
print(best, ans)  # 11, (3,14)

Вывод по нюансу: при поиске максимума иногда нужно брать полуоткрытый отрезок (например, [3,14)) — край 14 запрещён, а 3 разрешён. Искусственно «съедать» края 0.1 не требуется — достаточно понять, какие из них допускаются логикой задачи.

Задачи на минимальную длину A — дробные «подсдвиги» не нужны

Пример 2

P = [4, 15], Q = [12, 20]. Найти минимальную длину A, чтобы ((x∈P) ∧ (x∈Q)) → (x∈A) была тожд. истинна.

Идея

Должно выполняться {x: x∈P и x∈Q} ⊆ A. Левая часть — это пересечение отрезков, причём с теми же включёнными границами.

  • P∩Q = [max(4,12); min(15,20)] = [12; 15].
  • Минимальный A — ровно это пересечение: A = [12; 15].

Ответ: 3.

Мини-проверка на Python (целевые точки только по границам)

def inP(x): return 4 <= x <= 15
def inQ(x): return 12 <= x <= 20
def needA(x): return inP(x) and inQ(x)
A1,A2 = 12,15  # пересечение
# Проверяем только критические точки: 12 и 15
assert all((not needA(t)) or (A1 <= t <= A2) for t in (12,15))

Вывод: для задач на минимальную длину никакие дробные правки не допускаются — берём ровно пересечение (с учётом включённости границ), потому что любой меньший отрезок перестанет покрывать крайние точки.

Шаблоны «в 1–2 действия»

  • ( (x∈P) ≡ (x∈Q) ) → ¬(x∈A): A ⊆ комплимент к {P≡Q=1}. Максимальный A — самый длинный интервальный кусок в дополнении; каждый край проверяем отдельно (включать можно только там, где P≡Q=0).
  • ( (x∈P) ∧ (x∈Q) ) → (x∈A): P∩Q ⊆ A. Минимальный A — само пересечение (с точным типом границ).
  • (x∈P) → (x∈A): A должен содержать P (минимум — P); аналогично для Q.
  • (x∈A) → ¬(x∈P): A ⊆ комплимент к P; максимальный A — самый длинный кусок вне P.

Частые ловушки

  • Игнор границ. Отрезки в условии часто закрытые. Если формула требует включения крайних точек (как во втором примере) — A обязан их включать.
  • «Дробные» ухищрения. Искусственные ±0.1 не нужны. Решаем на уровне множеств: сначала строим точные множества истинности, затем берём нужный интервальный кусок.
  • Лишняя дискретизация. Проверка по сетке (0.1, 0.01) может дать неверный максимум/минимум. Критичны только точки ломания: границы P и Q (и их комбинации).

Разбор заданий

Задание 1. Делимость: найти максимальное A

Условие. Обозначим ДЕЛ(n,m) — «n делится на m». Для какого наибольшего натурального A формула
¬ДЕЛ(x,A) → (ДЕЛ(x,6) → ¬ДЕЛ(x,9)) тожд. истинна?

Идея.

Ложь только когда ¬ДЕЛ(x,A) и ДЕЛ(x,6), а при этом ДЕЛ(x,9) (т.е. x кратно 18). Чтобы противоречия не было, все кратные 18 должны делиться на A ⇒ A | 18. Наибольшее — 18.

print(18)

def div (z,y):#Определим функцию "Делится без остатка"
    return z%y==0
def f (xx,aa):#Определим функцию для логического выражения
    return div (xx,aa) or ( not div (xx,6) or not div (xx,9) )
for A in range (1000,0,-1):#Перебираем натуральные числа А от большего к меньшему
    flag=True
    for x in range (1,50000):# Перебираем все Х
        if  not f(x,A):
            flag=False
            break
    if flag:
        print (A)
        break

Задание 2. Линейные неравенства: найти минимальное A

Условие. Найти наименьшее целое A, при котором (5k+6n>57) ∨ ((k≤A) ∧ (n<A)) истинно для всех положительных целых k,n.

Идея.

Опасны только пары с 5k+6n ≤ 57. Для них должно быть k≤A и n<A. Возьмём максимум по этим парам:
max k при n=1k≤10; max n при k=1n≤8. Нужно A ≥ 10 и A > 8A = 10.

print(10)

def f (k,n,A):#Определим функцию для логического выражения
    return (5*k+6*n>57)or(k<=A and n<A)
for A in range(1,10000):
    flag=True
    for k in range(1,10000):
        for n in range(1,10000):
            if not f(k,n,A):
                flag=False
                break
        if not flag: break
    if flag:
        print(A)
        break

Задание 3. Отрезки и импликации: минимальный N

Условие. A=[70;90], B=[40;60], C=[0;N]. Функция
F(x) = (¬(x∈A) → (x∈B)) ∧ (¬(x∈C) → (x∈A)). При каком наименьшем N функция истинна более чем для 30 целых x?

Идея.

U→V¬U ∨ V. Тогда F(x)(x∈A ∪ B) ∧ (x∈A ∪ C) = A ∪ (B∩C).
Целых в A — 21. Нужно >30 всего ⇒ в B∩C = [40;min(60,N)] должно быть >9 целых ⇒ min(60,N) ≥ 49. Минимум — N = 49.

print(49)

def f(x,N):
    return ((70<=x<=90)or (40<=x<=60))and(0<=x<=N or (70<=x<=90))
for N in range (1,10000):
    lst=[]
    for x in range (1,10000):
        if f(x,N):
            lst.append(x)
        if len(lst)>30:
            break
    if len(lst)>30:
        print(N)
        break

Задание 4. Побитовые операции: минимальное A

Условие. Для какого наименьшего A формула
(x&29≠0) → ((x&17=0) → (x&A≠0)) тожд. истинна для всех неотрицательных x?

Идея.

Пусть 29=11101₂ (биты 16,8,4,1), 17=10001₂ (16,1). Опасные x: бит 16=0 и 1=0, но хотя бы один из (8,4)=1. Чтобы всегда было x&A≠0, A обязано содержать оба бита 8 и 4 ⇒ A = 8|4 = 12.

print(12)

m = 0
P = {i for i in range(5, 31)}
Q = {i for i in range(14, 24)}

for Amin in range(1, 101):
    for Amax in range(Amin + 1, 101):
        Flag = True
        A = {i for i in range(Amin, Amax)}
        for x in range(1, 101):
            f = not ((x in P) == (x in Q)) or (not(x in A))
            if not f:
                Flag = False
                break
        if Flag:
            m = max(m, len(A))
print(m)

Задание 5. Максимальная длина A для формулы с эквивалентностью

Условие. P=[5;30], Q=[14;23]. Найти наибольшую длину отрезка A, чтобы
((x∈P) ≡ (x∈Q)) → ¬(x∈A) была тожд. истинна.

Идея.

Нужно A ⊆ комплемент к области, где (P≡Q)=1. Эквивалентность равна 1 на
(−∞,5)[14,23](30,∞). Дополнение — [5,14)(23,30]. Максимум — 9 (интервал [5,14)).

Короткая проверка

def inP(x): return 5 <= x <= 30
def inQ(x): return 14 <= x <= 23
def ok(a1,a2):
    for t in (a1,14,23,a2):
        if a1 <= t <= a2 and (inP(t) == inQ(t)): return False
    return True
print(9, ok(5,14))

m = 0
P = {i for i in range(5, 31)}
Q = {i for i in range(14, 24)}

for Amin in range(1, 101):
    for Amax in range(Amin + 1, 101):
        Flag = True
        A = {i for i in range(Amin, Amax)}
        for x in range(1, 101):
            f = not ((x in P) == (x in Q)) or (not(x in A))
            if not f:
                Flag = False
                break
        if Flag:
            m = max(m, len(A))
print(m)

Задание 6. Минимальная длина A для формулы с дизъюнкцией и импликацией

Условие. P=[10,40], Q=[5,15], R=[35,50]. Найти наименьшую длину промежутка A, чтобы
( (x∈A) ∨ (x∈P) ) ∨ ( (x∈Q) → (x∈R) ) была тожд. истинна.

Идея.

Ложь возможна только там, где одновременно x∉A, x∉P и x∈Q, x∉R. Значит, A должен покрыть (Q \ R) \ P = [5,15]\[10,40] = [5,9].

Ответ: по вещественной длине — 4 (отрезок [5,9]); если в задаче явно сказано «для целых x» и под длиной понимают число целых точек, тогда 5.

Короткая проверка
def inP(x): return 10 <= x <= 40
def inQ(x): return 5 <= x <= 15
def inR(x): return 35 <= x <= 50
def F(x,a1,a2): return (a1<=x<=a2) or inP(x) or (not inQ(x) or inR(x))
for a1,a2 in [(5,9),(6,8)]:
    bad = [x for x in range(0,51) if not F(x,a1,a2)]
    print(a1,a2, bad[:5])

Про края отрезков. В задачах «на максимум» край может быть запрещён у A (полуоткрытый интервал), как в примере с эквивалентностью. В задачах «на минимум» дробные «подрезки» не нужны: берём точное пересечение/разность с теми же типами границ.

Задания для подготовки

Простые

Средние

Сложные

 

Понравилась статья? Поделиться с друзьями:
Школа Виктора Комлева