ЕГЭ 27 задача (произведение пар кратно 6 , элементы различаются не менее 4)
Написал функцию для подсчета пар произведение которых кратно 6.
with open('mod6dif4A.txt') as f:
n = int(f.readline())
lst = [int(x) for x in f]
def count_pairs(lst, n):
cnt2, cnt3, cnt6 = 0, 0, 0
for i in range(len(lst)):
mod2 = (lst[i] % 2 == 0)
mod3 = (lst[i] % 3 == 0)
if mod2 and mod3:
cnt6 += 1
elif mod2:
cnt2 += 1
elif mod3:
cnt3 += 1
return cnt6*(cnt6-1)//2 +cnt6 * (n - cnt6) + cnt2*cnt3
count_pairs(lst, n)
Как добавить в алгоритм условие, что номера элементов пары отличаются друг от друга не
менее чем на 4 ?
39383883848
ваш ответ явно не соответствует )
a = list(map(int, input().split())) # список с твоими числами
cnt = 0 # счетчик чисел
for x in range(len(a)): # запускаем первый цикл, который перебирает весь массив
for y in range(len(a)): # запускаем второй цикл
if x != y and a[x] * a[y] % 6 == 0 and a[x] - a[y] >= 4: # здесь проверка на то, что индексы не сопвпадают не нужна, но думаю так будет понятнее
cnt += 1
print(cnt)
Банальный перебор это понятно, нужно универсальное решение на большое кол-во записей, в файле около 1 мил. записей. Ваше решение не отработает на таком кол-ве. Моя функция универсальная там доп. фильтр просто нужно наложить на индексы пар.
Вы можете добавить условие, что номера элементов пары отличаются друг от друга не менее чем на 4, используя вложенный цикл и проверку разницы в индексах элементов. Вот модифицированный код:
with open('mod6dif4A.txt') as f:
n = int(f.readline())
lst = [int(x) for x in f]
def count_pairs(lst, n):
cnt2, cnt3, cnt6 = 0, 0, 0
for i in range(len(lst)):
mod2 = (lst[i] % 2 == 0)
mod3 = (lst[i] % 3 == 0)
for j in range(i + 1, len(lst)): # Вложенный цикл для второго элемента пары
if abs(i - j) >= 4: # Проверка разницы в индексах не менее чем на 4
mod2_j = (lst[j] % 2 == 0)
mod3_j = (lst[j] % 3 == 0)
if mod2 and mod3 and mod2_j and mod3_j:
cnt6 += 1
elif mod2 and mod2_j:
cnt2 += 1
elif mod3 and mod3_j:
cnt3 += 1
return cnt6 * (cnt6 - 1) // 2 + cnt6 * (n - cnt6) + cnt2 * cnt3
count_pairs(lst, n)
В данном коде добавлен второй цикл (for j in range(i + 1, len(lst))) для перебора всех элементов после текущего элемента i. Также добавлена проверка if abs(i - j) >= 4, чтобы удостовериться, что разница в индексах не менее чем 4.
Неверный алгоритм, число еще больше получается, а должно уменьшиться.