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

Автор orz, история, 3 года назад, По-русски

Рассмотрим такую задачу: даны три целых числа $$$x$$$, $$$y$$$ и $$$m$$$, $$$0 \leqslant x,y < m < 2^{32}$$$, найти $$$xy\bmod m$$$. По-хорошему хотелось бы просто перемножить эти два числа, а потом применить операцию остатка:

uint32_t prod(const uint32_t x, const uint32_t y, const uint32_t m)
{
	return x * y % m;
}

Как вы, возможно, догадываетесь, это решение неверное. Всё дело в том, что в такой процедуре возможно переполнение: операция x * y выполняется в типе uint32_t, и на самом деле промежуточным результатом выполнения этой операции будет не $$$xy$$$, а $$$xy\bmod2^{32}$$$. Если после этого взять результат по модулю $$$m$$$, он может отличаться от правильного:

$$$ \left(xy\bmod2^{32}\right)\bmod m\ne xy\bmod m. $$$

Выход прост — перемножать необходимо в большем типе:

uint64_t prod_uint64(const uint64_t x, const uint64_t y, const uint64_t m)
{
	return x * y % m;
}

Если так делать, то, поскольку $$$xy<2^{64}$$$, это произведение точно не переполнится, и после взятия результата по модулю получится правильный ответ.

Вопрос: а что делать, если $$$x$$$, $$$y$$$ и $$$m$$$ могут быть больше?

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

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

Автор orz, история, 3 года назад, перевод, По-русски

Сейчас проходит церемония закрытия IMO 2021.

Лучшими странами оказались:

  1. Китайская Народная Республика, 208 очков
  2. Россия, 183 очка
  3. Республика Корея, 172 очка
  4. Соединённые Штаты Америки, 165 очков
  5. Канада, 151 очко

Ссылка на английскую трансляцию: https://youtube.com/watch?v=LHi_xjvLEbI

На русскую: https://youtube.com/watch?v=23cTkofxbq4

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

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

Автор orz, история, 3 года назад, По-английски

IMO 2021

IMO 2021 opening ceremony takes place right now. Join the chat!

Russian: https://www.youtube.com/watch?v=c3APd3bCrFI

English: https://www.youtube.com/watch?v=DpZnQuUI27Y

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

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