Есть ли алгоритм который работает за О(log(n)).
Нужда в нём, у меня возникла при попытки решения этой задачи:
№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 3985 |
2 | jiangly | 3885 |
3 | jqdai0815 | 3682 |
4 | Benq | 3580 |
5 | orzdevinwang | 3526 |
6 | ksun48 | 3506 |
7 | ecnerwala | 3505 |
8 | Radewoosh | 3457 |
9 | Kevin114514 | 3377 |
10 | gamegame | 3374 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 170 |
2 | -is-this-fft- | 162 |
2 | Um_nik | 162 |
4 | atcoder_official | 160 |
5 | djm03178 | 157 |
5 | Dominater069 | 157 |
7 | adamant | 154 |
8 | luogu_official | 152 |
8 | awoo | 152 |
10 | TheScrasse | 147 |
Нужда в нём, у меня возникла при попытки решения этой задачи:
Название |
---|
Решето эратосфена, почитайте алгоритм.
Давайте создадим массив , который будет хранить наименьший простой делитель числа, т.к решето эратосфена работает за $$$O(n (log log n))$$$ Мы будем факторизировать в промежутке от $$$O(log(n))$$$ до $$$sqrt(n)$$$.
Спасибо
Судя по ограничениям, 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), но мне было бы лень.
Спасибо
Автокомментарий: текст был обновлен пользователем Otladka (предыдущая версия, новая версия, сравнить).