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

Автор wilcot, 3 месяца назад, По-русски

Совсем недавно у меня возникла необходимость решить такую задачу:

Для заданных $$$a$$$ и $$$m$$$ найти все такие $$$x$$$, что: $$$x^2 \equiv a \pmod{m}$$$.

Спустя некоторое время поиска по интернету и тщательному разбору каждого случая, я получил решение, которое работает для любых $$$a$$$ и $$$m > 0$$$ за время $$$O(\sqrt{m})$$$, либо за время $$$O(\log^2(m))$$$ если $$$a$$$ и $$$m$$$ взаимнопростые.

Ниже приведу рассмотренные мной случаи и ссылки на статьи (или обсуждения) для алгоритмов:

  1. $$$x^2 \equiv a \pmod{p}$$$, $$$a \ne 0$$$, $$$p$$$ — нечетное простое (ссылка).
  2. $$$x^2 \equiv a \pmod{p^k}$$$, $$$a \ne 0$$$, $$$k > 0$$$, $$$\gcd(a, p) = 1$$$, $$$p$$$ — нечетное простое (ссылка).
  3. $$$x^2 \equiv a \pmod{2^k}$$$, $$$a \ne 0$$$, $$$k > 0$$$, $$$\gcd(a, 2) = 1$$$ (cсылка).
  4. $$$x^2 \equiv 0 \pmod{p^k}$$$, $$$k > 0$$$, $$$p$$$ — простое. Заметим, что в таком случае $$$x^2$$$ должен делиться на $$$p^k$$$. Тогда $$$x$$$ должен делиться на $$$p^{\lceil\frac{k}{2}\rceil}$$$. Отсюда получаем, что $$$x = i \cdot p^{\lceil\frac{k}{2}\rceil}$$$, $$$0 \le i < p^{\lfloor\frac{k}{2}\rfloor}$$$.
  5. $$$x^2 \equiv p^s \pmod{p^k}$$$, $$$k > 0$$$, $$$0 < s < k$$$, $$$p$$$ — простое. Решения существуют только для $$$s = 2 \cdot t$$$. Доказывается от противного. Тогда очевидно, что $$$p^t$$$ является одним из решений ($$$(p^t)^2 = p^s$$$). Найдем оставшиеся решения. Пусть $$$x = p^t + y$$$, тогда $$$x^2 = p^s + 2 \cdot p^t \cdot y + y^2$$$. Заметим, что $$$2 \cdot p^t \cdot y + y^2$$$ должен делиться на $$$p^k$$$. В таком случае $$$x = p^t + i \cdot p^{\max(\lceil\frac{k}{2}\rceil, k - t - (p = 2))}$$$.
  6. $$$x^2 \equiv q \cdot p^s \pmod{p^k}$$$, $$$k > 0$$$, $$$0 < s < k$$$, $$$\gcd(q, p) = 1$$$, $$$p$$$ — простое. Пусть $$$x_1$$$ решение для $$$x^2 \equiv q \pmod{p^k}$$$, а $$$x_2$$$ решение для $$$x^2 \equiv p^s \pmod{p^k}$$$. Тогда $$$x = x_1 \cdot x_2$$$ будет являться решением исходной задачи.

Последние три случая пришлось выводить самостоятельно, поэтому ссылок нет. Доказательства пока поленился оформить в этом посте, хотя в целом они не очень сложны.

Общее решение находится с использованием Китайской теоремы об остатках и сведению к одному из указанных выше случаев.

Также приведу полную реализацию на Python (функция, решающая общий случай — discrete_sqrt):

Реализация

Полный текст и комментарии »

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

Автор wilcot, история, 13 месяцев назад, По-русски

Привет всем. Хочу рассказать про свою разработку — тестирующую систему Solve с открытым исходным кодом. Да, можно сказать Yet Another Online Judge :) Но не стоит сразу расходиться, у нее есть некоторые крутые моменты и может быть вам захочется поднять собственную инсталляцию для проведения какого-нибудь соревнования.

Вообще, система разрабатывается уже давно, но вот почему я решил написать только сейчас. Да потому что стабильный релиз вышел совсем недавно и полноценного тестирования до этого момента не проводилось.

Для кого этот пост

  1. Для тех, кто хочет проводить соревнования по СП.
  2. Для тех, кто готовит задачи преимущественно в великолепной системе Polygon.
  3. Для тех, кто хочет запустить свою систему без разработки с нуля (например огранизации).
  4. Для тех, кто просто интересуется.

Зачем вообще писать еще одну систему

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

  1. Приятный, современный, а самое главное понятный интерфейс. Как для участника, так и для администратора. Если это не так, сделано все возможное, чтобы его можно было с легкостью заменить.
  2. Отзывчивый интерфейс. Странички должны отстреливаться как пуля.
  3. Актуальные технологии и подходы. Вообще, система больше заточена для запуска в облаках, но для небольших соревнований (порядка 2-3 сотен участников) вы вполне можете обойтись одной физической машинкой, возможно стоящей у вас дома, в университете либо где-то еще.

Если вы возьмете существующую тестирующую систему, то скорее всего она не будет соответствовать какому-то из этих пунктов (а может сразу нескольким). Не сказать, что это преимущества, скорее просто другие подходы.

Ключевая функциональность

  1. Поддержка пакетов Polygon. Чтобы добавить задачу, вам нужно просто скачать пакет задачи из Polygon и загрузить его в систему. В дальнейшем будет добавлена поддержка автоматического скачивания пакета по URL задачи полигона.
  2. Поддержка форматов соревнований ICPC и IOI. Тут все стандартно — работает так же как и везде, есть заморозка.
  3. Поддержка контейнеризованных компиляторов. Очень полезная функциональность. По умолчанию система поставляется без единого компилятора. Компиляторы добавляются путем загрузки .tar.gz корневой файловой системы через API системы. Для удобства есть отдельная утилита с уже готовыми образами компиляторов.
  4. AWS S3. Если вам надо надежно хранить все ресурсы (пакеты задач, архивы компиляторов, исходники решений), или же вы хотите запустить сразу несколько инстансов системы, данная опция будет для вас полезна. Если же вам все это не надо, то можете использовать локальный диск для хранения всех данных, это подходит для проведения небольших контестов и сборов.
  5. Поддержка Scope Users — аналог внутренних пользователей Я.Контеста.
  6. Поддержка интерактивных задач — как же без них. К сожалению, полигон не умеет автоматически строить нормальный протокол взаимодействия. Поэтому тут по старинке, чтобы получить нормальный PDF надо ручками задать input и output для семплов.

Как все это выглядит

Условие задачи
Положение участников
Результат тестирования

Структура системы

Сама система разделена на 3 части:

  1. Репозиторий бекенда Solve: https://github.com/udovin/solve
  2. Репозиторий фронтенда Solve: https://github.com/udovin/solve-web
  3. Репозиторий с утилитой для Solve: https://github.com/udovin/solve-tools

Такое разделение открывает большой простор. Во-первых, вы можете изменить или реализовать с нуля фронтенд и получить уникальный интерфейс для своих нужд (или нужд огранизации). Во-вторых вы можете выбрать, какие компиляторы вам нужны, а какие можно не загружать (например в целях экономии места на диске).

Как попробовать

Поднять бекенд можно по инструкции в репозитории: https://github.com/udovin/solve/blob/master/README.md

Поднять фронтенд можно командой npm install && npm start в репозитории (необходимо наличие node): https://github.com/udovin/solve-web

Загрузить набор компиляторов можно выполнив команду: go build . && ./solve-tools compilers create в репозитории: https://github.com/udovin/solve-tools

Можете также воспользоваться Docker образами: udovin/solve и udovin/solve-web. При этом udovin/solve необходимо запускать с опцией --priviledged (иначе Docker смонтирует /sys/fs/cgroup в read-only, и запуск решений не будет работать). При запуске через докер c --priviledged настоятельно рекомендуется не использовать --user root (по умолчанию должно запуститься от пользователя solve, но можете это указать явно для повышения безопасности). В теории также возможно запустить через rootless-docker.

Какие требования

Операционная система: Linux 5.11+.

Настроенные cgroup2. Как настроить можно почитать тут: https://rootlesscontaine.rs/getting-started/common/cgroup2/

На этом пока все. Пост будет дополняться при необходимости. Интересны также пожелания, претензии и рассуждения в комментариях.

PS. По вопросам вы всегда можете написать в л.с.

Полный текст и комментарии »

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

Автор wilcot, история, 13 месяцев назад, По-английски

The XI BSUIR Open Programming Championship will be held from March 15 till April 29, 2023 (Minsk, Belarus).

Undergraduates and postgraduates of BSUIR, scholars, students from other universities and countries are invited to participate in the Championship.

The competition will take place in several rounds:

  • Quarterfinals (distance, problems in Russian and English) — March 15 — March 20 (both included);
  • Semifinals (distance/onsite semi-final, russian and english problems) — April 6;
  • Students Final — April 22 (Belarusian State University of Informatics and Radioelectronics, Minsk);
  • Schools Final — April 29 (Belarusian State University of Informatics and Radioelectronics, Minsk).

Quarterfinals are required only for BSUIR and school teams but other registered teams can also take part in it. Semifinals are required for all teams. BSUIR and school teams from Belarus take part onsite, other teams — online. Semifinals and Finals will be in ICPC format (5h contest).

To participate in the Championship teams need to be registered prior to April 3, 2023. Participation is free of charge — have fun.

The finalists are 30 (or more by jury decision) students teams, showed the best results in the qualifying rounds, but no more than:

  • 7 teams of undergraduates and postgraduates of BSUIR;
  • 2 teams from each of the universities of Belarus and abroad.

And 25 school teams showed the best results in the qualifying rounds.

University teams, which include at least two ICPC finalists 2022-2023, as well as high school teams, which include at least two winners of the final stage of the National Belarusian Olympiad in Informatics 2023, are allowed to participate in the finals of the Championship without passing the qualifying rounds.

Open BSUIR Programming Championship is held by the ICPC rules. During the Championship, the teams will be given 5 hours to solve 8 to 12 programming problems.

More information about the championship, as well as the problems and results of previous years, you may find at acm.bsuir.by.

here's a link there to a telegram channel and discussion, where you can talk to other participants and team up.

A little bit of last year video:
https://www.youtube.com/watch?v=nFZpkUFAO6Q
https://www.youtube.com/watch?v=07E0APqaB20

Полный текст и комментарии »

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

Автор wilcot, история, 5 лет назад, По-русски

Привет всем. Наверное каждый зарегистрированный на CodeForces хоть раз слышал о таком замечательном сайте, как e-maxx. Там можно получить довольно подробную информацию по алгоритмам и реализацию на C++ — для копипаста (что не совсем хорошо) или усвоения особенностей реализации алгоритма в неидеальном реальном мире.

Алгоритмов то много, но вот про Link-Cut Tree ничего небыло, а это очень интересная структура и довольно простая. На самом деле, разобраться с ней было не так то и просто с первой попытки, но со второй все стало на свои места. После этого захотелось посмотреть на примеры реализации, выбрать лучшие решения и реализовать самостоятельно. Но вот с примерами возникли проблемы — я не смог найти внятной реализации (может быть плохо искал?). После десятка переписываний кода и долгого дебага я получил довольно внятную структуру данных, которую можно использовать как замену HLD.

Я поддержал следующие операции (все работают за $$$O(\log n)$$$ амортизировано):

$$$link(x, y)$$$ — соединить вершину $$$x$$$ с вершиной $$$y$$$ (в случае, если вершина x не является корнем, дерево будет переподвешено).

$$$cut(x)$$$ — удалить ребро от вершины $$$x$$$ до родителя.

$$$distance(x, y)$$$ — найти расстояние между вершинами.

$$$depth(x)$$$ — найти глубину вершины $$$x$$$.

$$$lca(x, y)$$$ — найти LCA вершин $$$x$$$ и $$$y$$$.

$$$parent(x)$$$ — найти родителя вершины $$$x$$$.

$$$root(x)$$$ — найти корень дерева, где находится вершина x.

$$$path(x, y)$$$ — проверить наличие пути между вершинами x и y.

$$$evert(x)$$$ — переподвесить дерево за вершину $$$x$$$.

Следующие операции переподвешивают дерево за вершину $$$y$$$:

$$$query(x, y)$$$ — посчитать сумму значений в вершинах на пути от $$$x$$$ до $$$y$$$.

$$$update(x, y, v)$$$ — прибавить $$$v$$$ к каждой вершине на пути от $$$x$$$ до $$$y$$$.

Исходный код здесь.

На данный момент не гарантирую, что в данной реализации нет багов, если кто и найдет, то пожалуйста расскажите, как они воспроизводятся.

Хочется услышать критику со стороны сообщества (и о том, что я плохо искал или написал плохой код).

Полный текст и комментарии »

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

Автор wilcot, история, 5 лет назад, По-русски

Не хотел создавать данный пост — надеялся, что кто-то другой сделает, но нет :) На этой неделе проходят областные олимпиады в Беларуси. Все как обычно, два тура по 4 задачи, 5 часов на их решение. Здесь предлагаю обсудить задачки, решения и так далее.

Первый тур

Условия задач, обзорный лист.

Задача 1. Олимп-Сити

Решение

Задача 2. Дружелюбные соседи

Решение

Задача 3. Поворот плиток

Решение

Задача 4. Садовник

Краткое условие
Решение

Решение на C++.

Второй тур

Условия задач, обзорный лист.

Задача 1. Доставка почты

Задача 2. Контрольная работа

Решение

Задача 3. Текстовый редактор

Задача 4. Послание инопланетянам

Решение

Полный текст и комментарии »

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

Автор wilcot, история, 6 лет назад, По-русски

На этой неделе (26-30.03.2018) проходит республиканская олимпиада в г. Минске. Как обычно будет два тура, на которых будет предположительно по 4 задачи. К сожалению задачи будут, наверное, сильно сложными для меня, поэтому предлагаю обсудить решения в комментариях к этому посту. А можно обсудить не только задачи :)

Желаю удачи всем участвующим школьникам!

Полный текст и комментарии »

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

Автор wilcot, история, 6 лет назад, По-русски

Привет всем. На этой неделе (8-12 января 2018 года) проходит областная олимпиада по информатике в Беларуси. Олимпиада проходит во всех областях (а их у нас всего шесть) в одно и то же время с одним и тем же набором задач. Здесь можно обсудить олимпиаду, ознакомиться с уловиями задач (надеюсь, что все участники олимпиады ознакомятся с условиями на самой олимпиаде) и, может быть, если я смогу решить, с решениями.

Всем участникам желаю удачи!

Полный текст и комментарии »

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

Автор wilcot, история, 6 лет назад, По-английски

Very interesting contest.

But, how to solve task L, G and J?

Thanks in advance.

Полный текст и комментарии »

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

Автор wilcot, история, 6 лет назад, По-английски

Very interesting contest.

But, how to solve task K, L and H?

Thanks in advance.

Полный текст и комментарии »

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

Автор wilcot, 7 лет назад, По-русски

С 9 по 12 января 2017 года будет проходить областная олимпиада по информатике. Первый тур олимпиады состоится 10 января, второй — на следующий день. Постараюсь разместить здесь условия и решения задач как можно скорее, естественно не раньше начала самих туров :) В комментариях предлагаю обсудить задачи, поделиться идеями по поводу их решения, мыслями...

Всем участникам желаю удачи!

UPD. Первый тур завершен. Ниже можно почитать, как же получить полные баллы по задачам.

UPD2. Второй тур тоже завершен. Можно почитать разбор, кроме последней задачи — я ее не решал, да и решений можно придумать множество.

Полный текст и комментарии »

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

Автор wilcot, история, 8 лет назад, По-русски

Привет, Codeforces!

Меня зовут Иван Удовин. Хочу сказать, что Codeforces Round #344 будет проведен в этот четверг (3 марта 2016 г. в 19:35). Это наш первый раунд, но это не означает, что задачи будут скучными и неинтересными. Авторы задач: я (wilcot) и Илья Хейфец (xfce8888). Говорим спасибо Алексею Вистяжу (netman) и неизвестному человеку (он не захотел, чтобы его добавляли в анонс). Также я хочу сказать спасибо Федору Коробейникову (Mediocrity) за отличную идею по задаче E.

Мы благодарим Глеба Евстропова (GlebsHP) за его помощь в подготовке соревнования, Марию Белову (Delinur) за перевод условий на английский язык, и, конечно, команду Codeforces и Михаила Мирзаянова за уникальные платформы Codeforces и Polygon.

Раунд будет состоять из пяти задач. Главные герои: Блейк — основатель компании «Blake Technologies» и Крис — работник этой компании.

Разбалловка стандартная: 500, 1000, 1500, 2000, 2500.

Желаю всем удачи на соревновании, высокого рейтинга и побольше задач с Accepted.

PS. Разбор можно просмотреть здесь.

PPS. Поздравляем победителей:

Div. 2:

  1. lovelive

  2. Murtazo.Ali

  3. chychmek

  4. chrome

  5. Batman

Div. 1:

  1. Um_nik

  2. chffy

  3. natsugiri

  4. ershov.stanislav

  5. AndreiNet

Полный текст и комментарии »

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