Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

ЕГЭ 27 задача (произведение пар кратно 6 , элементы различаются не менее 4)

VV Мастер (1101), на голосовании 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 ?
Голосование за лучший ответ
Akihabara Akinovich Ученик (228) 5 месяцев назад
Вы можете добавить условие, что номера элементов пары отличаются друг от друга не менее чем на 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.
VVМастер (1101) 5 месяцев назад
Неверный алгоритм, число еще больше получается, а должно уменьшиться.
Буратино Карлович Деревянко Мыслитель (7611) 5 месяцев назад
 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)
VVМастер (1101) 5 месяцев назад
Банальный перебор это понятно, нужно универсальное решение на большое кол-во записей, в файле около 1 мил. записей. Ваше решение не отработает на таком кол-ве. Моя функция универсальная там доп. фильтр просто нужно наложить на индексы пар.
Буратино Карлович Деревянко Мыслитель (7611) VV, отсейте числа, которые кратные двум и трем
Тимофей Гончарук Знаток (296) 5 месяцев назад
39383883848
VVМастер (1101) 5 месяцев назад
ваш ответ явно не соответствует )
Похожие вопросы