Top.Mail.Ru
Ответы

ЕГЭ 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

Аватар пользователя
Ученик

ваш ответ явно не соответствует )

Аватар пользователя
Гуру
123456789
 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.

Аватар пользователя
Ученик

Неверный алгоритм, число еще больше получается, а должно уменьшиться.



Видео по теме