Задание 15 КЕГЭ: выражение с ДЕЛ истинно для всех x — перебор не лезет по времени, как сузить?
Тип задания 15, где надо найти наименьшее A, при котором выражение с ДЕЛ(x, A) и ещё парой условий истинно для ВСЕХ натуральных x. Я перебираю A от 1 и для каждого проверяю все x — это же бесконечно. Понятно, что так нельзя. Как правильно ограничить перебор?
2 ответа
Тут две хитрости: ограничить и A, и x.
По x: проверять все натуральные x не нужно. Условия с ДЕЛ "ломаются" на небольших числах — обычно достаточно прогнать x примерно до 1000 (а часто хватает и до 100). Если для всех x в этом диапазоне выражение истинно, считаем что оно истинно всегда.
По A: перебирай A в разумных пределах (1..1000) и бери первое подходящее.
def P(x, A):
# пример выражения: (ДЕЛ(x,A) -> ДЕЛ(x,6)) and (ДЕЛ(x,4) -> ДЕЛ(x,A))
def D(a, b): return a % b == 0
return (not D(x, A) or D(x, 6)) and (not D(x, 4) or D(x, A))
for A in range(1, 1001):
if all(P(x, A) for x in range(1, 1001)):
print(A)
break
Ключ — переписать импликацию A->B как (not A) or B. Дальше all(...) по диапазону x делает всю работу. break после первого найденного A даёт наименьшее.
Важный нюанс про диапазон x: если задание про делимость, безопасно брать x до НОК всех чисел в условии или просто до 1000 — этого хватает почти всегда. Но если в выражении сравнения вида x < 50, то достаточно перебрать x чуть дальше всех порогов. Когда не уверен — увеличь верхнюю границу (до 10000) и проверь, что ответ не поменялся. Если стабилен — он верный.