Ни одна из задач не была специально взята с "Wikipedia". Для меня было очень поразительно, что задача "B" была там.
A (Div 2). (Идея : Gerald, реализация : Aksenov239, код : 1670635)
Если длины строк не равны — то ответ "NO". Далее мы ищем позиции, на которых символы в строчках не совпадают. Если таких позиций не 2 — "NO". Иначе меняем 2 символа не этих позциях в первой строке, и сравниваем строки.
B (Div 2). (Идея : Aksenov239, реализация : Aksenov239, код : 1670637)
- Можно заметить, что всё можно считать в целых числах, так как k — целое число процентов.
- Для каждого гнома мы находим оптимальную стратегию — то есть проверяем 2 стратеги и выбираем лучшую.
- А далее просто сортируем.
A (Div 1). (Идея : Aksenov239, реализация : Aksenov239, код : 1652592) Предположим, что после i-го года, у нас было x треугольников вверх и y треугольников вниз. После ещё одной итерации можно заметить, что количество треугольников стало — 3x + y вверх и x + 3y вниз. Рассмотрим разницу между ними: на i-ый год она равна x - y, а не i + 1-ый — (3x + y) - (x + 3y) = 2 * (x - y). Теперь ясно, что разница между количеством треугольников за год увеличивается в 2 раза. Так как на i-th год разница становится 2i и всего треугольников 4i. То на i-ый год количество треугольников, направленных вверх —
. Это можно посчитать по модулю p, используя алгоритм быстрого возведения в степень.
B (Div 1). (Идея : Aksenov239, реализация : Aksenov239, код : 1652597) Ответ на эту задачу:
.
Доказательство:
. (Это неравенство о среднем арифметическом и среднем геометрическом. Для тех, кто желает ознакомиться.)
Равенство достигается только при
.
Но надо не забывать про нули. Если a = b = c = 0 — вы должны выбрать какую-нибудь подходящую точку — x + y + z ≤ S.
C (Div 1). Без комментариев. :-)!
D (Div 1). (Идея : Aksenov239, реализация : cerealguy, Gerald, Aksenov239, код : 1652604)
Это задачка на теорию чисел.
Постараюсь объяснить всё по шагам:
1) Сначала докажем, что НОД чисел не больше 2.
Пусть
. Возводим обе части в квадрат
, а нам нужно, чтобы
. Это означает, что d может быть только 2.
2) Сделаем наше длинное произведение покороче.
.
Мы это можем посчитать по модулю p быстро, и поделить на 2r - l, если k — нечётное.
3) Но есть несколько ловушек.
Первая — это не работает, когда p = 2 — но Вы справитесь сами.
Другая проблема посложнее, что если
, это означает, что для любого i ≥ l :
, из чего следует,
что для любого i ≥ l : k2i + 1 ≡ p2. И наше произведение по модулю p равно 2r - l + 1.
E (Div. 1) (Идея : Aksenov239, реализация : cerealguy, код : 1652611)
Эту задачу не взяли на РОИ, поэтому я предложил её здесь. На мой взгляд, задача вполне сложная. Если честно, я точно не знаю, что написал cerealguy, но его решение работает за O(nlogn) — без бин-поиска. Для меня это достаточно уже сложно, так как первоначальное решение было с ним. (Вроде, даже такие решения прошли.) Также были ещё решения с более худшей асимптотикой, но некоторые даже быстрее работали.
Я могу Вам только дать ключевые идеи решения, которые Вам помогут. (В конце концов, вы можете посмотреть решение cerealguy)
Идеи:
- Для каждого гнома найдём ближайшее метро. Это можно сделать за nlogn с помощью дерева отрезков или чего Вам там больше нравится.
- Можно заметить, что если гном идёт до метро, то другие гномы с меньшим расстоянием до метро, могут тоже идти туда — это никак не повлияет на ответ. Поэтому отсортируем гномов по этому расстоянию.
- Точки, до куда гном может дойти за t секунд, представляет собой ромб. И мы можем пересечь все ромбы за O(n) — пересечение будет похоже на прямоугольник.
- Построим начальное пересечение, когда никто не идёт в метро. Мы получим прямоугольник.
- Основная идея — для прямоугольника пересечения — ближайшее к нему метро всегда остаётся одним и тем же. Теперь можно пройтись по гномам в отсортированном порядке, мы умеем быстро пересчитывать прямоугольник пересечения — и поэтому можем быстро пересчитывать ответ.
И у нас получается решение за O(nlogn). Та-дамс!
Спасибо за Ваше внимание и понимание. Мне очень стыдно, за то что я натворил с задачей "C".