На вход программы поступает последовательность из N натуральных чисел. Необходимо найти количество пар различных элементов последовательности, находящихся на расстоянии не менее 6, таких что их сумма кратна 8, произведение кратно 4 и равно хотя бы одному числу из всей последовательности.
Даны два входных файла (файл A и файл B), каждый из которых содержит в первой строке количество чисел N (1 100000). Каждая из следующих N строк содержит одно натуральное число, не превышающее 10 000.
В ответе укажите два числа: сначала значения для файла А, затем для файла B.
Решение 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 + 6, n):
if (
((a[i] + a[j]) % 8 == 0)
and ((a[i] * a[j]) % 4 == 0)
and ((a[i] * a[j]) in a)
):
ans += 1
print(ans)
Решение 2 (эффективное)
f = open("27B.txt")
n = int(f.readline())
ans = 0
# Список с количествами чисел, удовлетворяющих определенным условием
# Индексы числа nums[x][y][z] обозначают следующее:
# x - максимальный делитель 4, которому кратно число
# y - остаток от деления числа на 8
# z - индекс числа в этом списке
k = [[], [], [], [], []]
for i in range(5):
for j in range(8):
k[i].append([])
a = [int(f.readline()) for i in range(n)]
# Превращаем a во множество, чтобы быстрее проверять наличие произведений
s = set(a)
line = [a[i] for i in range(5)]
for i in range(5, n):
x = a[i]
# Вычисляем остаток, который должен быть у пары
d = (8 - x % 8) % 8
# Ищем делители, при умножении на которые произведение будет кратно 4
for j in range(1, 5):
if 4 % j == 0 and x * j % 4 == 0:
# Проходимся по всем элементам с такими характеристиками
for elem in k[j][d]:
# Если такое произведение есть в последовательности - считаем его
if (elem * x) in s:
ans += 1
# Новый элемент на нужном расстоянии
t = line[i % 5]
# Определяем максимальный делитель, на который делится элемент
z = max(j for j in range(1, 5) if 4 % j == 0 and t % j == 0)
# Сохраняем этот элемент
k[z][t % 8].append(t)
# Добавляем его в очередь
line[i % 5] = x
print(ans)