Теория
Импликация 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=1 ⇒ k≤10; max n при k=1 ⇒ n≤8. Нужно A ≥ 10 и A > 8 ⇒ A = 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 (полуоткрытый интервал), как в примере с эквивалентностью. В задачах «на минимум» дробные «подрезки» не нужны: берём точное пересечение/разность с теми же типами границ.
Задания для подготовки
Простые
- https://kompege.ru/task?id=14
- https://kompege.ru/task?id=98 Смотреть разбор
- https://kompege.ru/task?id=407
- https://kompege.ru/task?id=467
- https://inf-ege.sdamgia.ru/problem?id=39244 Смотреть разбор Вариант 2
Средние
- https://kompege.ru/task?id=17748 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=16393 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=16447 Смотреть разбор
- https://kompege.ru/task?id=17556 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=9699 Смотреть разбор
- https://kompege.ru/task?id=20809 Смотреть разбор
- https://kompege.ru/task?id=20905 Смотреть разбор
- https://kompege.ru/task?id=17871 Смотреть разбор
- https://kompege.ru/task?id=20809 Смотреть разбор
- https://kompege.ru/task?id=23199 Смотреть разбор
- https://kompege.ru/task?id=307 Смотреть разбор
- https://future-step.ru/task/1524/ Смотреть разбор
Сложные
- https://kompege.ru/task?id=24970
- https://kompege.ru/task?id=11845
- https://kompege.ru/task?id=9370
- https://kompege.ru/task?id=6828
- https://kompege.ru/task?id=6087
- https://kompege.ru/task?id=5368
- https://kompege.ru/task?id=4770
- https://kompege.ru/task?id=3077
- https://kompege.ru/task?id=1345
- https://kompege.ru/task?id=927
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=8010
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=8007
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5920
- https://education.yandex.ru/ege/inf/task/25343130-15c0-4096-a396-4a72c38efffe
- https://education.yandex.ru/ege/inf/task/ee5e8ba0-73ee-4bcf-ad2b-be94781809a2
- https://education.yandex.ru/ege/inf/task/6265fbdf-4b55-4957-9610-3e18a422da7f
- https://education.yandex.ru/ege/inf/task/93f27805-f3b8-4151-8125-b3f3d9f61037
- https://education.yandex.ru/ege/inf/task/397f6a09-6a70-4935-846f-e2fc72915ec9
- https://education.yandex.ru/ege/inf/task/65af06a7-ed7e-423d-ada2-68a85bc1a9e1
- https://education.yandex.ru/ege/inf/task/4cb47800-ed22-4851-98b4-dcee23fc0448
- https://education.yandex.ru/ege/inf/task/f1912e9d-bfea-448f-bf17-96b14e7f7b44
- https://education.yandex.ru/ege/inf/task/ec4ba1a8-b53f-4e8b-94e1-7d7c7fc9d89e
- https://education.yandex.ru/ege/inf/task/7e4937e4-e2f6-48c7-9960-a3bf2dfb4263
- https://education.yandex.ru/ege/inf/task/21fef5ec-ac54-4333-b360-20a22600f6c8
- https://education.yandex.ru/ege/inf/task/95d1df00-4bb0-4a7a-99be-da6b94ae8c07
- https://education.yandex.ru/ege/inf/task/f7addc6a-f459-474c-9d46-d999765a5bba
- https://education.yandex.ru/ege/inf/task/cf61f112-a1cf-40f3-9fef-d1a97ba29075
- https://education.yandex.ru/ege/inf/task/e9f0b745-489c-482c-a332-4627a087b00a
- https://education.yandex.ru/ege/inf/task/62a6ffc3-2e0e-4b8c-afd3-8f4dfd6c726a
- https://education.yandex.ru/ege/inf/task/42f2f42f-16cf-4453-a8bf-26afaba65c51
- https://education.yandex.ru/ege/inf/task/f21ffc71-18b2-48d5-a4b3-5286316264af
- https://education.yandex.ru/ege/inf/task/d77be3dc-51ca-4902-9e72-0c90e8ff3d86
- https://education.yandex.ru/ege/inf/task/0721cb7f-43fe-4b69-ab81-31e482c3e8a9
- https://education.yandex.ru/ege/inf/task/02da09ba-9555-44ca-936b-b3b73582dffd
- https://education.yandex.ru/ege/inf/task/fcd4ef3a-8c80-468a-8217-17f9e35df44d
- https://education.yandex.ru/ege/inf/task/bd2ca87d-5e9a-42d3-baf5-6c56de658ac9
- https://education.yandex.ru/ege/inf/task/40f385cb-9a60-461a-ac05-9a615bc49755
- https://education.yandex.ru/ege/inf/task/7e59bed3-2ef7-4f3c-989d-90518e9dde1d
