Задача к ЕГЭ по информатике на тему «прочие прототипы» №5

Задание выполняется с использованием прилагаемых файлов

В текстовом файле записан набор натуральных чисел, не превышающих 109.  Гарантируется, что все числа различны. Необходимо определить, сколько в наборе таких пар чисел, где сумма их квадратов присутствует в файле и также является полным квадратом, и чему равна наименьшая из сумм квадратов таких пар.

Входные данные.

Первая строка входного файла содержит целое число N  — общее количество чисел в наборе. Каждая из следующих N  строк содержит одно число. В ответе запишите два целых числа: сначала количество пар, затем наименьшую сумму.

Под парой подразумевается любые два различные элемента последовательности.

Пример входных данных:

5

1

2

3

4

25

В данном случае есть одна подходящая пара: 3  и 4  (сумма квадратов 25  ).

В ответе надо записать числа 1  и 25  .

Решение через бин. поиск

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)

Ответ: 17 25
Оцените статью
Я решу все!