На вход подается число , а затем последовательность из
натуральных чисел. Напишите программу, которая находит количество пар элементов, произведение которых кратно 6, а сумма кратна 5, при условии, что элементы стоят на расстоянии не меньше 5, то есть
, где
— номера элементов последовательности.
В первой строке файла “.txt” находится число
, в следующих
строках даны элементы последовательности. Найдите количество пар элементов, удовлетворяющих условию.
В ответ запишите два числа через пробел: сначала искомое значение для файла A, затем для файла B.
Переборное решение:
f = open("8_A.txt")
n = int(f.readline())
a = []
for i in range(n):
a.append(int(f.readline()))
cnt = 0
for i in range(n):
for j in range(i + 1, n):
if a[i] * a[j] % 6 == 0 and (a[i] + a[j]) % 5 == 0 and j - i >= 5:
cnt += 1
print(cnt)
Эффективное решение:
f = open(’8_B.txt’)
s = 5 # Расстояние между элементами
k = 5 # Чему должна быть кратна сумма
p = 6 # Чему должно быть кратно произведение
d = [6, 3, 2, 1] # Делители числа p в порядке убывания
n = int(f.readline())
a = [int(i) for i in f]
# Список с количествами чисел, удовлетворяющих определенным условием
# Индексы числа nums[x][y] обозначают следующее:
# x - максимальный делитель из списка d, которому кратно число
# y - остаток от деления числа на k
nums = [[0] * k for _ in range(p + 1)]
cnt = 0
for i in range(s, n):
# Находим остаток первого числа пары
ost1 = a[i - s] % k
# Находим максимальный делитель из d, которому кратно число
for j in d:
if a[i - s] % j == 0:
# Увеличиваем количество чисел с такими характеристиками
nums[j][ost1] += 1
break
# Вычисляем остаток от деления на k числа-пары для x
ost2 = (k - (a[i] % k)) % k
# Увеличиваем ответ на количество пар с x,
# произведение с которыми будет кратно p,
# а сумма будет кратна k
for j in d:
if a[i] % j == 0:
cnt += nums[p // j][ost2]
print(cnt)