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

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

В очень узких кругах возникла интересная (нет) таска на запросы. Сможете ли вы ее решить?

Дан массив размера n из целых неотрицательных чисел. Дано q запросов одного вида.

Запрос на подотрезке (L, R) — нужно вывести max[ lcm(a, b) — gcd(a, b) ], где a и b — какие-то числа на подотрезке с L по R. Cчитать что gcd(0, 0) == 0 и lcm(0, 0) = 0.

n <= 10^5, q <= 10^5

Напишите свои идеи в комментариях.

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

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

Автокомментарий: текст был обновлен пользователем omoyamo (предыдущая версия, новая версия, сравнить).

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

Auto comment: topic has been translated by omoyamo (original revision, translated revision, compare)

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

What is the source of this problem?

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

What is the range of the integers in the array?

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

I don't know exact time complexity, but use treap, where every node maintains '2D-Persistent tree with FFT on each node'. To further optimization use meet-in-the-middle, but I don't know how to merge, but at all you can create a graph, after that go to Dominator tree and do some stuffs with combinatorics or Burnside's lemma. But I don't know time complexity.

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

I don't have an exact time complexity, but I think I do have a few steps towards a solution.

First let's make a segment tree of sets. Since it doesn't help to have multiple of a single number, we can operate on those sets instead of the raw array.

Second, let's compensate for the GCD by getting the maximum 2-3 LCM's. This should be safe because GCD is almost always small relative to LCM.

Now, how do we find the largest LCM quickly from a set of numbers? I suggest we simply run two for loops, each starting from the large end of the set, and calculate the LCMs. Importantly, we should short-circuit when we cannot possibly find a larger LCM later in the loop.

If we consider the first run of the outer loop, either we find some LCM greater than the largest number in the set, or it we don't. If we don't then we know all the rest of the numbers are factors of this one, so there is a small number of them and our loops will be short. If we don't, then we have some larger number as out biggest current LCM. Each inner loop can them be short circuited when the two elements multiplied is smaller than that LCM.

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

    "This should be safe because GCD is almost always small relative to LCM." Yeah, but this is not an approximation problem. What about something like 4 7 10 15 4 7 10 15 4 7 10 15 etc.?