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

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

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

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

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

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

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

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

  • »
    »
    13 лет назад, # ^ |
      Проголосовать: нравится +13 Проголосовать: не нравится

    Да, правильно. Иначе тривиал =)

    • »
      »
      »
      13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Дак модуль суммы равен сумме модулей же)

      • »
        »
        »
        »
        13 лет назад, # ^ |
          Проголосовать: нравится +18 Проголосовать: не нравится

        К.О.

        4 mod 3 + 8 mod 3 <> (4+8) mod 3
        
        • »
          »
          »
          »
          »
          13 лет назад, # ^ |
            Проголосовать: нравится -42 Проголосовать: не нравится

          Я не силен в математике, но разве по правилам не надо левую часть всю тоже по модулю взять? Тогда ведь все получается.

      • »
        »
        »
        »
        13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        И вся сумма модулей берется по модулю, так что мы недалеко ушли.

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

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

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

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

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

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

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

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

  • »
    »
    13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    как я понял, фича в том, что мы берем по модулю каждое слагаемое, но не берем сумму

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

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

»
13 лет назад, # |
  Проголосовать: нравится +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.