27.07 Макс/мин, кол-во пар, смешаное кратно/не кратно
Ошибка.
Попробуйте повторить позже
На вход подаётся последовательность из натуральных чисел, каждое из которых не больше
.
Напишите программу, вычисляющую количество пар элементов последовательности, сумма которых делится на
или
,
произведение кратно
и хотя бы одно число из пары больше
, находящихся на расстоянии не меньше
.
Формат входных данных
В первой строке дано количество чисел , в каждой из последующих
строк записано одно натуральное число, не
превышающее
.
Формат выходных данных
В ответе запишите два числа через пробел: сначала искомое количество для файла A, затем для файла B.
Пример:
10
56
84
26
81
28
93
60
29
72
36
Ответом для примера будет:
Решение 1 (неэффективное)
f = open("27A.txt") n = int(f.readline()) a = [int(f.readline()) for x in range(n)] ans = 0 for i in range(n): for j in range(i + 5, n): if ((a[i] + a[j]) % 5 == 0) or ((a[i] + a[j]) % 7 == 0): if (a[i] * a[j]) % 6 == 0: if (a[i] > 40) or (a[j] > 40): ans += 1 print(ans)
Решение 2 (эффективное)
f = open(’3_B.txt’) s = 5 # Расстояние между элементами p = 6 # Чему должно быть кратно произведение d = [6, 3, 2, 1] # Делители числа p n = int(f.readline()) x = [int(i) for i in f] # Списки с количествами чисел, удовлетворяющих определенным условием # Индексы числа nums_{k}[x][y][z] обозначают следующее: # x - больше ли число чем 40 (0 - нет, 1 - да) # y - делитель из списка d, которому кратно число # z - остаток от деления числа на k nums_5 = [[[0] * 5 for _ in range((p + 1))] for _ in range(2)] nums_7 = [[[0] * 7 for _ in range((p + 1))] for _ in range(2)] nums_35 = [[[0] * 35 for _ in range((p + 1))] for _ in range(2)] cnt = 0 for i in range(s, n): # Элемент, находящийся на расстоянии s от текущего t = x[i - s] # Заполняем списки, увеличивая количества чисел по условиям for j in d: if t % j == 0: nums_5[int(t > 40)][j][t % 5] += 1 nums_7[int(t > 40)][j][t % 7] += 1 nums_35[int(t > 40)][j][t % 35] += 1 # Вычисляем остатки от деления на {k}, которыми должны обладать пары для текущего числа ost_5 = (5 - (x[i] % 5)) % 5 ost_7 = (7 - (x[i] % 7)) % 7 ost_35 = (35 - (x[i] % 35)) % 35 # Если текущее число больше 40, его можно ставить в пару с числами и больше и меньше 40 if x[i] > 40: # Ищем наибольший делитель, на который делится текущее число for j in d: if x[i] % j == 0: # Вычисляем необходимый парный делитель для числа-пары dl = p // j # Количество чисел, которые делится на 5 или на 7, равносильно # сумме количества чисел, делящихся на 5, и количества чисел, делящихся на 7, # из которых вычли количество чисел, делящихся на 35 for r in range(2): cnt += nums_5[r][dl][ost_5] + nums_7[r][dl][ost_7] - nums_35[r][dl][ost_35] break # Если текущее число не больше 40, его можно ставить только в пары к числам больше 40 else: for j in d: dl = p // j if x[i] % j == 0: cnt += nums_5[1][dl][ost_5] + nums_7[1][dl][ost_7] - nums_35[1][dl][ost_35] break print(cnt)
Специальные программы

Программа
лояльности v2.0
Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!
Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение
Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты
Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей
Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ
Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!