Имеется набор данных из целых чисел. Рассматриваются все пары различных элементов последовательности. Необходимо определить количество таких пар, произведение которых будет кратно
и сумма кратна
.
В первой строке входных данных задаётся количество чисел
. В каждой из последующих
строк записано одно целое положительное число, не превышающее
.
Пример входных данных:
5
3
315
0
159
1
Выходные данные для приведённого выше примера: 2
В ответе укажите через пробел два числа: сначала значение искомого количества для файла А, затем для файла B.
Переборное решение:
f = open(’6_A.txt’)
n = int(f.readline())
nums = [int(i) for i in f]
cnt = 0
for i in range(n):
for j in range(i + 1, n):
if (nums[i] + nums[j]) % 53 == 0 and nums[i] * nums[j] % 3 == 0:
cnt += 1
print(cnt)
Эффективное решение:
f = open(’6_B.txt’)
k = 53
n = int(f.readline())
# Список количеств чисел, где первый индекс - кратность 3 (0 - не кратно, 1 - кратно),
# а второй индекс - остаток от деления на k
nums = [[0] * k for _ in range(2)]
cnt = 0
for i in range(n):
x = int(f.readline())
ost = (k - (x % k)) % k
# Если x кратен 3, к нему в пару можно ставить как кратные 3, так и не кратные 3 числа
if x % 3 == 0:
cnt += nums[0][ost] + nums[1][ost]
nums[1][x % k] += 1
# Если x не кратен 3, к нему в пару можно ставить только кратные 3 числа
else:
cnt += nums[1][ost]
nums[0][x % k] += 1
print(cnt)