Спасибо, разберусь с Монте-Карло и отпишусь)
Если не сложно, то можно поподробней про Ро? А то чувствую я, что как-то неправильно понимаю его.

Я решил немного изучить быстрые алгоритмы факторизации и проверки на простоту. Начнем с проверки на простоту:
В Кормене вычитал про тест Миллера-Рабина, увидел, что реализация довольно простая, написал, даже работает..:) У меня в силу скудных познаний математики возникли вопросы, на которые не Кормен, ни гугл ответов (понятных для меня) не дали. Отличие теста Миллера-Рабина от простой проверки малой теоремы Ферма заключается в том, что по ходу возведения в степень мы ещё и проверяем некий нетривиальны корень из 1. Собственно вопрос: что такое этот корень из 1 и как он влияет на алгоритм, простоту числа и т.д?
С факторизацией дела немного хуже обстоят. В том же Кормене  прочитал про метод Полларда, который ро. Мало того, что метод для меня совсем не очевиден, так ещё работает он достаточно сомнительно. В моем алгоритме я сначала проверял число на простоту, потом проверял все простые числа меньшие чем 10^7, которые в самом начале решетом нашел, а потом, зная, что N=pq, писал Полларда-ро. Реализация из Кормена и та, котору я списал с е-макса, на злостных тестах вроде (2^31-1)*(10^9+7) не работает. Гуглил другие методы, из всех понятным мне кажется лишь метод Ферма, который, кстати, прилично работает, но на вышеупомянутых тестах и он валится. Метод Лемана в реализации простой, но там мне кажется огромная константа в силу постоянных вычислений корней разных степеней+переполнение на тестах где N^4/3>2^63-1, то есть работает где-то для N<=10^13 степени, что как-бы не серьезно. Хотя я могу ошибаться, ибо опираюсь лишь на статью из Википедии.
Знаю, есть ещё куча разных методов, вроде р+1, р-1 и так далее, но они тёмные какие-то для меня.
Какими методами пользуетесь вы, в чём их суть? Если не сложно, то объясните в двух словах детали реализации и почему они правильные? Возможно я просто плохо понимаю тот же Полларда-ро, а на самом деле он хорошо работает, но моя кривая реализация подвела.
Заранее спасибо!

3

(5 ответов, оставленных в Problems)

Ладно, всем спасибо, сам уже понял решение за NM/32. А быстрее решений не существует?

4

(5 ответов, оставленных в Problems)

Такое подходит.  Можно поподробней?

5

(5 ответов, оставленных в Problems)

Хмм... А зачем, если можно уже дфсом за N^2? Я сейчас не говорю о полном графе, так как при больших N входные данные слишком уж большие.

6

(5 ответов, оставленных в Problems)

Собственно, есть DAG, нужно для каждой вершины узнать сколько вершин достижимо из неё. Нужно самое быстрое решение. Слышал, можно как-то сделать за (N^2)/32, но слабо представляю как.

7

(1 ответов, оставленных в Problems)

Хотелось бы узнать решения последних двух задач. Пятая - вроде бы, боян, но ни разу не решал нормально такую. Шестую довольно простенько сделал за О(maxT) на запрос, но этого, конечно же, мало, точнее сказать - много:)

8

(2 ответов, оставленных в Algo)

Жаль...

9

(2 ответов, оставленных в Algo)

Я реализовал алгоритм Карацубы и хотел сдать задачу, где нужно просто умножать большие числа:
http://www.spoj.pl/problems/MUL/cstart=10
Но неожиданно для себя получил ТЛЕ. Сделал оптимизацию для обычного умножения, чтобы не брать каждый раз остаток,  а в конце один раз пересчитывать и переносить по разрядам. Это увеличило скорость где-то в 2 раза, но этого всё ещё не достаточно. Обычное умножение делаю, если длина числа меньше 70, я уже много перепробовал, это приблизительно самая оптимальная константа для этих ограничений. Числа, конечно же, храню по основанию 10^9. Лично я думаю, что я либо сильно накосячил где-то(не знаю где), либо много времени тратится на выделение памяти при рекурсивных вызовах, так как там передаётся 2 массива по 3000 инт64 и ещё 7 массивов локальных.
У кого-то были такие проблемы с этим алгоритмом?Если да, то посоветуйте, пожалуйста, как его оптимизировать. И вообще эффективен ли он на практике?

10

(1 ответов, оставленных в Algo)

Чтобы сумма была минимальна, нужно сложить все параметры и работать с ними smile

11

(2 ответов, оставленных в Algo)

Интересная идея, спасибо!

12

(2 ответов, оставленных в Algo)

Как решать эту задачу двоичным подъёмом в режиме онлайн? Нам ведь нужно определять является ли одна вершина предком другой. Я знаю, что если выполнить все запросы добавления, а потом найти все LCA, то тоже будет правильно, но мне интересно как решать эту проблему "влоб".

13

(8 ответов, оставленных в Problems)

Ну так выбирать стоит не по размеру поддерева, очевидно, что это не верно, а рекурсивно.

14

(8 ответов, оставленных в Problems)

Если я не ошибаюсь, то можно перебирать корни, а потом жадным обходом строить дерево, а именно: на каждом шаге выбирать такие две вершины, что количество ещё не выбранных, достижимых из двух сыновей этих вершин максимально. Наверное, прийдётся делать рекурсивно, но сложность должна будет быть адекватной.

15

(8 ответов, оставленных в Algo)

На каждую из задач, которые тебя интересуют, довольно легко написать решение за Н*Н, генератор, тестилку. Так что ты можешь их тестировать самостоятельно, при этом, получая тесты, на которых твои решения валяться.

16

(8 ответов, оставленных в Algo)

ааааа, так тебе алгоритмы нужны?:)
Ближайшая пара точек хорошо описана на этом же сайте, даже я её здесь понял.
Пересечение двух отрезков делается сканлайном, не очень сложно, советую почитать в Кормене.
Идея такая же, как и с отрезками.
Каких-то быстрых алгоритмов для нахождения расстояния я не встречал, но наверное, они существуют. А вообще можно за Н*М делать: просто искать расстояние от каждого отрезка первого полигона до каждой точки второго.
Принадлежность точки многоугольнику тоже умею только за Н делать, но оно даже за Н не часто надо smile

17

(8 ответов, оставленных в Algo)

http://informatics.mccme.ru/moodle/
тут есть немного задач на геометрию.На задачи на пересечение отрезков, кругов, поиск ближайших(дальнейших) точек можно самому написать тривиальный перебор, генератор, тестилку чтобы самому протестить.

18

(8 ответов, оставленных в Algo)

На информатикс.

19

(32 ответов, оставленных в Problems)

У меня, например, хеши ТЛяться:) Возможно они кривые, но всё же... smile Разве тебе не интересны ещё способы решить такую тривиальную задачу?

20

(32 ответов, оставленных в Problems)

Спасибо!
Касательно суффиксного дерва, насколько я знаю, там не далеко уже и до дерева Укконена.

21

(32 ответов, оставленных в Problems)

Да в память не влезет 100%, но идея изящнее хешей smile
А можно поподробнее с п-функцией  идею рассказать?

22

(32 ответов, оставленных в Problems)

Кстати, есть ещё такое интересное решение:
Строим бор по суффиксам исходной строки. Теперь что представляет из себя вершина бора? -  префикс одного из суффиксов. Все префиксы всех суффиксов - все подстроки. Очевидно, что одинаковых префиксов в боре не будет. Теперь мы доказали, что количество вершин в таком боре - количество разных подстрок.

23

(9 ответов, оставленных в Problems)

Реализация тоже smile

24

(9 ответов, оставленных в Problems)

А что здесь особенного?Насколько я понял, это стандартный связный список. Сразу начал читать описание - так и подумал, потом увидел комменты о том, что вычитал где-то у АCRush'a, перечитал описание, вроде бы ничего необычного не заметил. Мб для сишников это не проблема, но мне на паскале без связного списка на графы разве что Флойда писать можно:)

25

(32 ответов, оставленных в Problems)

Добавление у меня такое же, но я кажется понял в чём ошибка у меня: ты наверное перебираешь все подстроки по длине сначала, а потом очищаешь список. Я же всё кидал в один список...:/
Большое спасибо за помощь!