На вход подаётся последовательность из натуральных чисел, каждое из которых не больше
. Напишите программу, вычисляющую количество пар элементов последовательности, сумма которых делится на
или
, произведение кратно
и хотя бы одно число из пары больше
, находящихся на расстоянии не меньше
.
Формат входных данных
В первой строке дано количество чисел , в каждой из последующих
строк записано одно натуральное число, не превышающее
.
Формат выходных данных
В ответе запишите два числа через пробел: сначала искомое количество для файла 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)