Здравствуйте. Может кто знает как можно посчитать функцию Ейлера для всех i, 1 <= i <= n за время O(n)?
№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 3993 |
2 | jiangly | 3743 |
3 | orzdevinwang | 3707 |
4 | Radewoosh | 3627 |
5 | jqdai0815 | 3620 |
6 | Benq | 3564 |
7 | Kevin114514 | 3443 |
8 | ksun48 | 3434 |
9 | Rewinding | 3397 |
10 | Um_nik | 3396 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 167 |
2 | Um_nik | 163 |
3 | maomao90 | 162 |
3 | atcoder_official | 162 |
5 | adamant | 159 |
6 | -is-this-fft- | 158 |
7 | awoo | 155 |
8 | TheScrasse | 154 |
9 | Dominater069 | 153 |
10 | nor | 152 |
Здравствуйте. Может кто знает как можно посчитать функцию Ейлера для всех i, 1 <= i <= n за время O(n)?
Название |
---|
кстати задача с идущего контеста...
Мне эта задача попалась на сайте spoj.pl
Могу посоветовать только http://e-maxx.ru/algo/prime_sieve_linear. Попробуй во время построения решета тащить еще функцию Эйлера. Если числа различаются на 1 простой множитель. пересчитать ее не составит труда.
Можно за
Спасибо, но такая сложность получит TLE. Поэтому мне нужна линия.
А можно узнать, что за задача?
http://www.spoj.pl/problems/GCDEX/
Ну я ее сдавал подобным подходом, только считал для каждого числа его минимальный делитель, а на основании этой информации считал уже функцию Эйлера.
Не верю в то, что там где пройдёт линия не пройдёт N * Log N. Логарифм по основанию E = 2.71...
Кажется, асимптотика чуть лучше... (см. по этой же ссылке)
Оффтоп: не могли бы исправить Ейлера на Эйлера?
. Посчитаем сначала для всех чисел от 1 до n величину mindi — минимальный делитель числа (очевидно это простое число). Теперь будем считать величины phi(i) от 1 до n. Допустим мы нашли все phii до некоторого idx - 1 включительно и теперь хотим найти phi(idx). Тут два варианта либо простое mindidx входит в idx в степени ровно 1, либо в большей. Если оно входит в степени больше одного, тогда phi(idx) = phi(idx / mindidx) * (mindidx - 1) иначе phi(idx) = phi(idx / mindidx) * (mindidx). Все минимальные делители можно найти за O(n) крутым решетом Эратосфена с e-maxxа. Остальное тоже за O(n) работает.
вроде, нахождение делителей за О(n) работает дольше, чем обычное решето
Ну когда я в последний раз писал и правда получилось немного дольше. На 107 обычное решение работало 200, а за O(n) где-то 300. Но вроде автору хотелось решения за O(n) :-) А если нужно просто сдать задачу, то можно с хаками написать обычное решето и сдать
По-моему, если MINDidx входит в idx в степени == 1, то phi(idx) = phi(idx / MINDidx) * (MINDidx — 1), иначе phi(idx) = phi(idx / MINDidx) * MINDidx.
Ага поправил