Задание выполняется с использованием прилагаемых файлов
В текстовом файле записан набор натуральных чисел, не превышающих Гарантируется, что все числа различны. Необходимо определить, сколько в наборе таких пар чисел, где сумма их квадратов присутствует в файле и также является полным квадратом, и чему равна наименьшая из сумм квадратов таких пар.
Входные данные.
Первая строка входного файла содержит целое число — общее количество чисел в наборе. Каждая из следующих
строк содержит одно число. В ответе запишите два целых числа: сначала количество пар, затем наименьшую сумму.
Под парой подразумевается любые два различные элемента последовательности.
Пример входных данных:
В данном случае есть одна подходящая пара: и
(сумма квадратов
).
В ответе надо записать числа и
.
Решение через бин. поиск
def bin_search(a, x):
n = len(a)
left = -1
right = n
while right - left > 1:
middle = (left + right) // 2
if a[middle] >= x:
right = middle
else:
left = middle
if right != n and a[right] == x:
return True
else:
return False
f = open(’1.txt’)
n = int(f.readline())
a = []
counter = 0
min_summ = 10**12
for i in range(n):
a.append(int(f.readline()))
a = sorted(list(set(a))) # Уменьшаем количество элементов до уникальных
for i in range(len(a)):
for j in range(i+1, len(a)):
if (a[i]**2 + a[j]**2)**0.5 == int((a[i]**2 + a[j]**2)**0.5):
if bin_search(a, a[i]**2 + a[j]**2):
counter += 1
min_summ = min(min_summ, a[i]**2 + a[j]**2)
print(counter, min_summ)
Решение через поиск по множеству
f = open(’1.txt’)
n = int(f.readline())
a = []
counter = 0
min_summ = 10**12
for i in range(n):
a.append(int(f.readline()))
b = set(a) # Уменьшаем количество элементов до уникальных
for i in range(len(a)):
for j in range(i+1, len(a)):
if (a[i]**2 + a[j]**2)**0.5 == int((a[i]**2 + a[j]**2)**0.5):
if (a[i]**2 + a[j]**2) in b:
counter += 1
min_summ = min(min_summ, (a[i]**2 + a[j]**2))
print(counter, min_summ)