Районная олимпиада 2019-2020 информатика
Задача F. Тройки
Ограничение по времени:
1 секунда
Ограничение по памяти:
256 мегабайт
Дан массив $a$ длины $n$, который состоит из целых натуральных чисел. Все числа в массиве различные. Вам нужно посчитать количество троек $i$, $j$, $k$, что $i \ne j$, $i \ne k$, $j \ne k$ и $a_i*a_j=a_k^2$.
Формат входного файла
В первой строке задано одно целое число $n$ $(3 <= n <= 10^5)$. В следующей строке задано $n$ целых натуральных чисел $a_1$, $a_2$, $\dots$, $a_n$ $(1 <= a_i <= 3 * 10^5)$.
Формат выходного файла
Выведите одно целое число — ответ на задачу.
Система оценки
Данная задача содержит $10$ тестов. Каждый тест оценивается в $10$ баллов:
- $n <= 100$, $1 <= a_i <= 500$. Тесты с номерами 1-3.
- $n <= 5000$, $1 <= a_i <= 10000$. Тесты с номерами 4-6.
- $n <= 10^5$, $1 <= a_i <= 300000$. Тесты с номерами 7-10.
Пример:
Вход 6 6 3 9 4 12 27Ответ
6( Aibar Kuanyshbay )
Комментарий/решение:
Пусть p[i] - минимальное натуральное число такое что p[i] * i - квадрат,
а также C -> максимальное число в массиве a
Тогда нетрудно заметить что p[a[i]] = p[a[j]]
Поэтому надо перебирать только такие числа что p[x] = p[y]
Нетрудно доказать что максимальный размер множества чисел с одинаковым p[i] будет равен sqrt(C)
Тогда обычный перебор будет работать за O((n / sqrt(C)) * sqrt(C) ^ 2) =
O(n * sqrt(C))
А общая асимптотика будет: O(ClogC + n * sqrt(C))
Возможно, что при неправильном наборе формул, они будут
доредактированы модератором. При этом содержание не будет меняться.