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

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

Добрый день, Codeforces!

Меня интересует, умеет ли кто-нибудь считать такую сумму  . Или такую сумму (они друг через друга выражаются)  (деление целочисленное).

Буду очень признателен любым методам подсчета быстрее чем линия (или около-линия).

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

»
14 лет назад, скрыть # |
 
Проголосовать: нравится +4 Проголосовать: не нравится

Правильно понимаю, что модуль находится под суммой?

»
14 лет назад, скрыть # |
 
Проголосовать: нравится +18 Проголосовать: не нравится

Гер, скачай разбор отсюда. Задача aladin.

»
14 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

O(n), где n — размер модуля. Или это тоже имелось ввиду под линией?

»
14 лет назад, скрыть # |
Rev. 2  
Проголосовать: нравится +34 Проголосовать: не нравится

Вот в этой статье в разделе 3 эта сумма считается за .

»
14 лет назад, скрыть # |
Rev. 2  
Проголосовать: нравится +11 Проголосовать: не нравится

Получается x*b+a*((x*(x-1)/2) (mod n). Но это слишком просто, чтобы писать пост; что я понял не так? :) upd: упс, надо было читать комментарии перед написанием своего.

»
14 лет назад, скрыть # |
 
Проголосовать: нравится +37 Проголосовать: не нравится

На онсайте Opencup'а летом 2011 года была задача — посчитать количество целых точек в прямоугольном треугольнике. И решалась она за . Эта задача достаточно просто к ней сводится. Алгоритм решения примерно тот же самый, что и алгоритм из статьи из комментария выше.

»
14 лет назад, скрыть # |
 
Проголосовать: нравится +37 Проголосовать: не нравится

Коротко, и по русски ^_^
Научимся решать задачу для случая, когда a>=b.
Есть такое k, что a=k*b+c, где c<b.
Ответ, следовательно — [(k*b+c)/b]+[2(k*b+c)/b]+[3(k*b+c)/b]...+[n(k*b+c)/b].
Где [x] — то же самое, что и trunc(x).
На самом деле ответ состоит из двух частей — k+2k+3k+4k...+nk — это легко посчитать и [c/b]+[2c/b]+[3c/b]...+[nc/b] — это та же задача, только уже с новыми a,b,n.
Чтобы ее решить, просто как-бы мысленно повернем треугольник на 90 градусов и мы получим новые a,b,n для этого повернутого прямоугольника, хотя все равно понятно, что это будет одно и то же.
И эти a,b,n можно получить такими, чтобы выполнялось a>=b и опять решить задачу, которую мы научились решать.
И там еще надо будет немного повозиться с точками лежащими на гипотенузе.
На самом деле, все будет изменяться так же, как и в алгоритме Евклида. Так что мы получим решение за сложность, за которую работает Евклид, то есть за быстро.
Это примерные намеки на решение.
Мой код — решение задачи SPOJ GPINTRI.