Loading [MathJax]/jax/output/SVG/jax.js

Районная олимпиада 2019-2020 информатика


Задача F. Тройки

Ограничение по времени:
1 секунда
Ограничение по памяти:
256 мегабайт

Дан массив a длины n, который состоит из целых натуральных чисел. Все числа в массиве различные. Вам нужно посчитать количество троек i, j, k, что ij, ik, jk и aiaj=a2k.
Формат входного файла
В первой строке задано одно целое число n (3<=n<=105). В следующей строке задано n целых натуральных чисел a1, a2, , an (1<=ai<=3105).
Формат выходного файла
Выведите одно целое число — ответ на задачу.
Система оценки
Данная задача содержит 10 тестов. Каждый тест оценивается в 10 баллов:
  1. n<=100, 1<=ai<=500. Тесты с номерами 1-3.
  2. n<=5000, 1<=ai<=10000. Тесты с номерами 4-6.
  3. n<=105, 1<=ai<=300000. Тесты с номерами 7-10.
Пример:
Вход
6
6 3 9 4 12 27
Ответ
6
( Aibar Kuanyshbay )
посмотреть в олимпиаде

Комментарий/решение:

  5
4 года 4 месяца назад #

Здравствуйте, эту задачу возможно решить за такие ограничение?

  1
3 года 1 месяца назад #

Решение на 60 баллов за O(n^2)

показать/скрыть код

C++

пред. Правка 4   0
9 месяца 22 дней назад #

Пусть 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))

показать/скрыть код

C++