Блог пользователя Otladka

Автор Otladka, история, 4 часа назад, По-русски

До меня дошли легенды, что есть алгоритм который работает за О(log(n)).

О доблестные программисты, поведайте же мне о нём !!!

Нужда в нём, у меня возникла при попытки решения этой коварной задачи:

Задача:

3 cекунды и 64 мб

Дано N(N <= 10^6)

и N чисел (a[i] <= 10^7)

Вывести для каждого a[i] его факторизацию(разложение на множители)

36 = 2^2 * 3^2

  • Проголосовать: нравится
  • -7
  • Проголосовать: не нравится

»
4 часа назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Решето эратосфена, почитайте алгоритм.

  • »
    »
    4 часа назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Давайте создадим массив , который будет хранить наименьший простой делитель числа, т.к решето эратосфена работает за $$$O(n (log log n))$$$ Мы будем факторизировать в промежутке от $$$O(log(n))$$$ до $$$sqrt(n)$$$.

    Код
    • »
      »
      »
      2 часа назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Спасибо

»
106 минут назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

Судя по ограничениям, Pollard-rho вполне зайдет. Будет что-то в духе $$$O(N a^{1/4} \log(a))$$$, где $$$a = \max\limits_{i \in [1,N]\cap \mathbb N} a_i$$$ (оценка скорее всего неверна, но достаточно хороша для представления о времени работы алгоритма). В коде это будет как-то так: https://pastebin.com/j4giMndL (реализация функция is_prime_miller_rabin, pollard и factor_integer не моя, а kactl'овская). Для скорости я бы еще [вырезано цензурой] добавил прагм и более быстрый ввод-вывод, но мне лень, а для демонстрации этого не нужно.

Если говорить об алгоритме факторизации чисел за $$$O(\log n)$$$, то эта будет сложность на запрос. Там еще пред-подсчет есть, который (в простейшем случае) можно иметь оценку $$$O(n \log \log n)$$$ по времени. Более подробно: https://www.geeksforgeeks.org/prime-factorization-using-sieve-olog-n-multiple-queries/. Можно, конечно, сделать этот пред-подсчет более быстрым, например, за $$$O(n)$$$ (см. https://cp-algorithms.com/algebra/prime-sieve-linear.html), но мне было бы лень.