Тема 15. Алгебра логики – преобразование логических выражений

15.06 Смешанное

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела алгебра логики – преобразование логических выражений
Решаем задачи

Ошибка.
Попробуйте повторить позже

Задача 1#29730

Обозначим через ДЕЛ(n  , m  ) утверждение «натуральное число n  делится без остатка на натуральное число m  ». Обозначим через m&n  поразрядную конъюнкцию неотрицательных целых чисел m  и n  .

Определите максимальное значение A  , такого что выражение

(ДЕ Л(x,3)∧ ДЕЛ (x,7)) → ((x &13 ⁄= 0) ∨(x&32 = 0)∨ (A⋅x ≤ 120834))

тождественно истинно, то есть принимает значение 1  при любом целом x ≤ 1000  .

Показать ответ и решение

Решение 1 (ручками):

Запишем мечты врагов:

(
||| x ... 3
||||   .                 (  .
|||| x .. 7               |||| x.. 21
||{                     ||{ x ≥ 1-00-0
  x&13 = 0        ⇒              2
|||| x&32 ⁄= 0            |||| A ⋅x > 120834
||||                     ||(
|||| A ⋅x > 120834         x ≤ 1000
|( x ≤ 1000

Обратим внимание, что максимальный икс, который мы можем взять, исходя из условия задачи, равен 1000  .

Враги мечтают, чтобы x  делился на 21  и был меньше или равен 1000  , а также соответствовал маске 1  _00  _02  (исходя из маски понимаем, что числа будут четные), значит будут брать x  из диапазона {42,84,126,168,210,...,840,882,924,966  }, которые еще должны соответствовать маске 1  _00  _02  .

Тогда друзья говорят, что A ⋅x ≤ 120834  . Максимальное x  , которое будут брать враги — 882  (удовлетворяет всем условиям), значит A ≤ 120834= 137
     882  .

 

Решение 2 (прогой):

def f(x):
    return (((x % 3 == 0) and (x % 7 == 0)) <= \
        (((x & 13 != 0) or (x & 32 == 0)) or (A * x <= 120834)))

ans = 0
for A in range(1, 1000):
    flag = True
    for x in range(1, 1001):
        if not f(x):
            flag = False
            break
    if flag:
        ans = max(ans, A)
print(ans)

Ответ: 137

Ошибка.
Попробуйте повторить позже

Задача 2#29731

Обозначим через ДЕЛ(n, m) утверждение «натуральное число n делится без остатка на натуральное число m». Обозначим через m&n  поразрядную конъюнкцию неотрицательных целых чисел m  и n  .

На числовой прямой даны отрезки Q = [12;48]  и P = [32,64]  .

Определите наименьшее натуральное число A  , такое что выражение

Д ЕЛ (x,5)∨ (x ∕∈ Q )∨ (x &A = 0)∨ ((x ∈ P) → (|x − 31| ≥ 17))

тождественно истинно, то есть принимает значение 1 при любом целом значении переменной х.

Показать ответ и решение

Решение 1 (ручками):
Система для врагов:

(
||| x|| ... 5
||||
|||{ x ∈ Q
  x&A ⁄= 0
|||
|||| x ∈ P
|||(
  |x − 31| < 17

Раскроем последнее неравенство системы: x− 31 < 17  и x− 31 > − 17  , то есть x < 48  и x > 14  , то есть x ∈ (14;48)  . Враги мечтают, чтобы x ∈ [32;48]  P  и в Q  ), x ∈ (14;48)  и при этом они не делились на 5  . Таким образом, чтобы победить, враги будут брать только следующие иксы: {32,33,34,36,37,38,39,41,42,43,44,46,47} . Также враги мечтают, чтобы x&A ⁄= 0  . Максимальный икс, который могут взять друзья, равен 47  , то есть 1011112  , а минимальный икс = 32  , то есть 1000002  . Отсюда заметим, что ни один икс, подходящий врагам, не содержит единичку в пятом с конца разряде в двоичной записи. Тогда мечты врагов такие: «Вот бы у числа A  была единичка в первом, втором, третьем, четвёртом или шестом с конца разряде в двоичной записи».

Друзья говорят: «Нет, число A  не содержит единичку ни на одном из этих разрядов». Минимальное A  , которое могут взять друзья, равно 100002  , то есть Amin = 16  .

 

Решение 2 (прогой):

def f(x, A):
    Q = [12, 48]
    P = [32, 64]
    return ((x%5 == 0) or (not inn(x, Q)) or (x & A == 0) or ((inn(x, P)) <= (abs(x - 31) >= 17)))

def inn(x, P):
    return P[0] <= x <= P[1]

for A in range(1, 1000):
    flag = True
    for x in range(-1000, 1000):
        if not f(x, A):
            flag = False
            break
    if flag:
        print(A)

Ответ: 16

Ошибка.
Попробуйте повторить позже

Задача 3#29732

Обозначим через ДЕЛ(n, m) утверждение «натуральное число n делится без остатка на натуральное число m». Обозначим через m&n  поразрядную конъюнкцию неотрицательных целых чисел m  и n  .

Так, например, 14&5 = 1110 &0101 = 0100  = 4
           2     2      2  .

На числовой прямой дан отрезок Q = [12;48]  и множество S = {45,23,67} .

Определите наименьшее натуральное число A  , такое что выражение

(¬Д ЕЛ(x,3)∧ (x∈∕S)) → ((|x− 50| ≤ 7) → (x ∈ Q ))∨ (x&A = 0)

тождественно истинно, то есть принимает значение 1 при любом целом значении переменной х.

Показать ответ и решение

Решение 1 (ручками):

Система для врагов:

(
||| x ||... 3
||||
|||{ x ∕∈ S
  |x− 50| ≤ 7
|||
|||| x ∕∈ Q
|||(
  x&A  ⁄= 0

Разберём мечты врагов:

1)  |x − 50| ≤ 7  , то есть x ∈ [43;57]  .

2)  x∈∕Q  , то есть x ∈ [49,57]  (объединяя с первым условием)

3)  x∈∕S  , то есть x ∈ [49,57]  (предыдущие два условия уже учли третье)

4)  x| ...| 3  , то есть x ∈ {49,50,52,53,55,56} (учитывая три предыдущих условия)

Теперь рассмотрим последнюю мечту: x&A  ⁄= 0  . Поскольку мы знаем все иксы, которые будут выбирать враги, переведём их в двоичную систему счисления:

4910 = 1100012

5010 = 1100102

5210 = 1101002

5310 = 1101012

5510 = 1101112

5610 = 1110002

Таким образом, мечты врагов такие: «Вот бы на любом из последних шести разрядов в двоичной записи у числа    A  была единичка».

Друзья говорят: «Нет, любая из последних шести цифр числа A  в двоичной записи равна нолику». Таким образом, Amin = 10000002 = 26 = 64  .

 

Решение 2 (прогой):

def inn(x, A):
    return A[0] <= x <= A[1]

def f(x, A):
    S = {45, 23, 67}
    Q = [12, 48]
    return (((x % 3 != 0) and (not (x in S))) <=
    ((abs(x - 50) <= 7) <= (inn(x, Q))) or (x & A == 0))

for A in range(1, 1000):
    flag = True
    for x in range(-100, 1000):
        if not f(x, A):
            flag = False
            break
    if flag:
        print(A)
        break

Ответ: 64

Ошибка.
Попробуйте повторить позже

Задача 4#29733

Обозначим через ДЕЛ(n  , m  ) утверждение «число n  делится без остатка на число m  ». Для дробных чисел это означает, что результатом деления n  на m  является целое число.

На числовой прямой даны отрезки P = [15,23]  , Q = [17,34]  . Найдите максимальную длину промежутка A  , такого что выражение

                             ------- -------            -------
(¬ (Д ЕЛ (x,4.5)) ∧¬ (Д ЕЛ (x,3))∨ (x ∈ Q) ∨(x ∈ A ))∧((x ∈ P )∨ (x ∈ A))

тождественно истинно, то есть принимает значение 1  при любом натуральном числе x  .

Показать ответ и решение

Решение 1 (ручками):

Запишем мечты врагов:

⌊  (
   {x ∕∈ P         (
||  (              |||| x ∈ A
||   x ∈ A         |||| ⌊   x∈∕P
|| (|x ∈ Q          ||{ |(
|| ||||           ⇒     ||||| x ∈ Q
|| |{x ∈ A          |||| ||{ ⌊  .
|| |⌊   ..          |||| |⌈|| ⌈ x.. 3
|⌈ ||||⌈ x . 3        ||(  |(    ..
  |(  x ... 4.5            x . 4.5

Рассмотрим мечты врагом из совокупности отдельно:

1)  Враги хотят, чтобы x ∕∈ P  , то есть x ∈ [1,15)∪ (23,+ ∞ )  , но так как мы берем только натуральные иксы, то x ∈ [1,14]∪ [24,+∞ )  .

2)  Враги хотят, чтобы x ∈ Q  и x  был кратен 4.5  или 3  . Тогда они будут брать x  из промежутка [17,34]  , кратные 4.5  или 3  , и по условию нас интересуют натуральные иксы, значит x ∈ {18,21,24,27,30,33} .

Так как условия 1)  и 2)  указаны в совокупности, значит врагам подойдут иксы, находящиеся в объединении множеств первого и второго условия.

Поэтому враги мечтают, чтобы x ∈ [1,14]∪{18} ∪{21} ∪[24,+∞ )  и чтобы x ∈ A  .

 

Друзья говорят: «Нет, все эти иксы не принадлежат A  ». Тогда друзья могут взять, например, A = (14,18)  или A = (18,21)  или A = (21,24)  . Наибольшую длину имеет A = (14,18)  , его длина = 4  .

 

Решение 2 (прогой):

def inn(x, A):
    return A[0] <= x <= A[1]
def f(x, A):
    P = [15, 23]
    Q = [17, 34]
    return (((x % 4.5 != 0) and (x % 3 != 0) or (not inn(x, Q)) \
         or (not inn(x, A))) and (inn(x, P) or (not inn(x, A))))
ans, n = 0, 15
borders = [0 ,0]
for a in range(1 * n, 70 * n):
    for b in range(a, 70 * n):
        A = [a / n, b / n]
        flag = True
        for x in range(1, 70 * n):  # только натуральные
            if not f(x, A):
                flag = False
                break
        if flag:
            if A[1] - A[0] > ans:
                ans = A[1] - A[0]
                borders[0] = A[0]
                borders[1] = A[1]
print(borders)
print(ans)

Видим, что программа вывела промежуток [14.066,17.933]  и его длину ≈ 3.866  .

Значит, ответом является промежуток с дробными границами, левая граница которого стремится к 14  , а правая к      18  , тогда длина стремится к 4  .

Ответ: 4

Ошибка.
Попробуйте повторить позже

Задача 5#29734

Обозначим через ДЕЛ(n  , m  ) утверждение «натуральное число n  делится без остатка на натуральное число m  ».

На числовой прямой дан промежуток A  и множество S = {23,27,45,46,47,67} .

Определите максимальную длину промежутка A  , такого что его правая граница не больше 50  и выражение

                                                                -------
((¬Д ЕЛ(x,3)∧ (y ∕∈ S)) → ((x > 7) → (y > 11)))∨ (x⋅y ≤ 76)∨(x ∕∈ A)∨ (y ∈ A)

тождественно истинно, то есть принимает значение 1  при любых натуральных значениях переменных x  , y  .

Показать ответ и решение

Решение 1 (ручками):

Система для врагов:

(
||| x ||... 3
||||
|||| y ∕∈ S
|||| x > 7
|{
| y ≤ 11
||||
|||| x⋅y > 76
|||| x ∈ A
|||(
  y ∈ A

Враги мечтают, чтобы x > 7  , y ≤ 11  и x ⋅y > 76  . Тогда при xmin = 8  единственные y  , которые смогут взять враги, чтобы условие x⋅y > 76  выполнялось, будут равны 10  и 11  . Заметит, что при увеличении x  враги смогут брать больше вариантов y  , но всегда максимальное значение ymax = 11  . Все натуральные y <= ymax  не принадлежат S  , значит условие y ∕∈ S  автоматически выполнено. Мечты врагов такие: «Вот бы y ∈ A  ».

Друзья говорят: «Нет, y ∕∈ A  ». Тогда при условии, что правая граница отрезка A  не больше 50  , Amax = (11,50]  (чтобы даже ymax ∕∈ A  ), а его максимальная длина равна 50 − 11 = 39  .

 

Решение 2 (прогой):

def inn(x, A):
    return A[0] <= x <= A[1]

def f(x, y, A):
    S = {23, 27, 45, 46, 47, 67}
    return (((x % 3 != 0) and (not y in S)) <= ((x > 7) <= (y > 11))) \
        or (x * y <= 76) or (not inn(x, A)) or (not inn(y, A))

n = 5
ans = 0
for a in range(1 * n, 50 * n):
    for b in range(a, 50 * n + 1):  # + 1 чтобы проверить саму точку b
        A = [a / n, b / n]
        flag = True
        for x in range(1, 100):
            for y in range(1, 15):
                if not f(x, y, A):
                    flag = False
                    break
            if not flag:
                break
        if flag:
            ans = max(ans, A[1] - A[0])
print(ans)

Ответ: 39

Ошибка.
Попробуйте повторить позже

Задача 6#33605

Обозначим через ДЕЛ(n  , m  ) утверждение «натуральное число n  делится без остатка на натуральное число m  ».

На числовой прямой дан отрезок B = [50,70]  . Для какого наибольшего натурального числа A  формула

¬ДЕ Л(x,A) → ((x ∈ B) → ¬Д ЕЛ (x,15))

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

Показать ответ и решение

Решение 1 (ручками):
Система для врагов:

(
|||x ||... A
|{
|x ∈ B
|||(  ..
 x . 15

Враги мечтают, чтобы x ∈ [50;70]  B  ) и при этом они делились на 15  . Таким образом, единственный подходящий x  на отрезке [50;70]  , делящийся на 15  , равен 60  . Тогда мечты врагов такие: «Вот бы x  , равный 60  , не делился на A  ».

Друзья говорят: «Нет, 60  делится на A  ». Максимальное A  равно максимальному делителю числа 60  , то есть Amax = 60  . Это и есть ответ.

 

Решение 2 (прогой):

def f(x, A):
    B = [50, 70]
    return (x % A != 0) <= (inn(x, B) <= (x % 15 != 0))

def inn(x, B):
    return B[0] <= x <= B[1]

maxim = 0
for A in range(1, 300):
    flag = True
    for x in range(1, 500):
        if not(f(x, A)):
            flag = False
            break
    if flag:
        maxim = A
print(maxim)

Ответ: 60

Ошибка.
Попробуйте повторить позже

Задача 7#56882

Обозначим через ДЕЛ(n,m  ) утверждение «натуральное число n  делится без остатка на натуральное число m  ».

Для какого наименьшего натурального числа A  формула

¬ ДЕ Л(xy, A) ∨(y >  4095)∨ (x > 2y + 1 )∨ ¬Д ЕЛ (y, 2)∨ Д ЕЛ (x, 2)

тождественно истинна, то есть принимает значение 1  при любых натуральных значениях x  и y  ?

Показать ответ и решение

Запишем, чего хотят враги:

(
|||| Д ЕЛ (xy, A )
|||| y ≤ 4095
|{
| x ≤ 2⋅y+ 1
||||
|||| Д ЕЛ (y, 2)
( ¬Д Е Л(x, 2)

Исходя из этого уменьшим поиск x,y  по нечетным и четным значениям соответственно:

Решение 1  (прогой, работает пару минут):

for A in range(1, 10000):
    flag = True
    for x in range(5, (4095 + 1)*2 + 1, 2):
        for y in range(2, 4095 + 1, 2):
            if x*y % A == 0:
                flag = False
                break
        if not flag:
            break
    if flag:
        print(A)
        break

Решение 2  (ручками):

Повторим, чего хотят враги:

(|
|||| Д ЕЛ (xy, A )
|||| y ≤ 4095
{
|| x ≤ 2⋅y+ 1
|||| Д ЕЛ (y, 2)
|||(
  ¬Д Е Л(y, 2)

Друзья хотят, чтобы выполнялось условие ¬Д Е Л(xy, A)  при всех хотелках врага. Соответственно, нужно понять, когда же произведение xy  не будет делиться на A  .

Исходя из хотелок врага мы понимаем, что будут подбираться такие xy  , чтобы они делились на A  . Это значит, что A  будет содержать внутри себя делители хотя бы одного набора xy  . Наша задача — предоставить такое A  , чтобы при любом произведении xy  там не было такого делителя, что и в A  .

Заметим, что y  — четные числа. Значит, в самых больших y  будет содержаться максимум 211  умноженное на что-то. Тогда, чтобы минимизировать A  возьмем A = 212  (т.к. 2  в степени что-то будет явно меньше, чем числа большие в степени что-то).

Ответ: 4096

Ошибка.
Попробуйте повторить позже

Задача 8#57873

Пусть на числовой прямой дан отрезок B = [35;65]  . Обозначим через ДЕЛ(n, m) утверждение «натуральное число n делится без остатка на натуральное число m». Для какого наибольшего натурального числа А формула

(x ∈ B ) −→ (¬ ДЕЛ(x,21)∨ ДЕЛ(x,A ))

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

Показать ответ и решение
b = [i for i in range(35, 66)]
for a in range(1, 100):
    f = 0
    for x in range(1, 300):
        if ((x in b) <= (x % 21 != 0 or x % a == 0)) == False:
            f = 1
            break
    if f == 0:
        print(a)

Ответ: 21

Ошибка.
Попробуйте повторить позже

Задача 9#57877

Обозначим через ДЕЛ(n, m) утверждение «натуральное число n делится без остатка на натуральное число m»; и пусть на числовой прямой дан отрезок B = [36;51]  . Найдите наименьшую возможную длину отрезка A, при котором формула

(x ∈ A )∨ ((x ∈ B) − → ¬ ДЕЛ(x,5))

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

Показать ответ и решение
b = [i for i in range(36, 52)]

mn = 10**10
for a1 in range(1, 250):
    for a2 in range(a1+1, 251):
        f = 0
        a = [i for i in range(a1, a2)]
        for x in range(1, 500):
            if ((x in a) or ((x in b) <= (x % 5 != 0))) == False:
                f = 1
                break
        if f == 0:
            # -1, потому что мы считаем длину,
            # т.е. количество "дорог" между точками(целыми числами),
            mn = min(len(a)-1, mn)
print(mn)

Ответ: 10

Ошибка.
Попробуйте повторить позже

Задача 10#61631

На числовой прямой дан отрезок Q = [30;51]  . Обозначим через ДЕЛ(n,m)  утверждение «натуральное число n  делится без остатка на натуральное число m  ». Обозначим k&p  , обозначающее поразрядную конъюнкцию k  и  p  (логическое «И» между соответствующими битами двоичной записи). Определите наименьшее натуральное число  A  , такое что выражение

(¬Д ЕЛ(x,5)∧ x∈∕25,50,55) → (((|x − 41| ≤ 11) → (x ∈ Q )) ∨(x&A ⁄= 0))

тождественно истинна, то есть принимает значение 1 при любом целом значении переменной х.

Показать ответ и решение
for a in range(1,1000):#Перебираем значения а
    f = 0 #Изначально флаг опущен
    for x in range(10000): #Перебираем для каждого а значения x
        if (((x % 5 != 0) and (x not in [25,50,55])) <= (((abs(x-41) <= 11) <= (30 <= x <= 51)) or (x&a!=0))) == False:
            f = 1 #Если условие выполнилось,значит данное а нам не подходит. Поднимаем флаг, прерываем работу цикла и переходим к следующему значению а
            break
    if f == 0:# Если флаг не был поднят,значит данное а нам подходит
        print(a)
        break

Ответ: 4
Рулетка
Вы можете получить скидку в рулетке!