Довольно скучные запросы о количестве взаимно простых с указанным числом чисел на отрезках массива без изменения

Revision ru3, by dmkz, 2018-06-09 20:12:49

Здравствуйте! Идеи, как решить следующую задачу, зашли в тупик, поэтому нужна помощь:

У нас есть массив a[1...n] (n ≤ 200000, 1 ≤ a[i] ≤ 1000000) из целых чисел и есть q запросов к этому массиву (q ≤ 200000) вида: li, ri, xi (1 ≤ li ≤ ri ≤ n, 1 ≤ xi ≤ 1000000). Для каждого запроса мы должны ответить сколько есть различных индексов j таких что li ≤ j ≤ ri и gcd(a[j], x) = 1.

Вот, что удалось осознать:

1) До 1.000.000 всего 78.498 простых чисел.

2) Каждое число во вводе не может иметь более 7 различных простых делителей, так как 2 × 3 × 5 × 7 × 11 × 13 × 17 = 510.510

3) Задачу можно решать только на префиксе, так как: count(li, ri, xi) = count(1, ri, xi) - count(1, li - 1, xi), li > 1

Ограничения по времени 1.5 с, памяти 32 MB.

Задача была на полуфинале ВКОШП в Красноярском крае в сезоне 2017/2018 как задача "G. Скучные запросы". Разбор и архив жюри найти не удалось, а очень хочется. Здесь ее можно сдать, ограничения по времени немного увеличены в сравнении с оригиналом, так как сервер не самый быстрый, а система 32-битная.

Пример:

6
1 2 3 4 5 6
4
1 6 1 --> 6
1 6 2 --> 3
2 4 6 --> 0
3 6 10 --> 1

UPD: решено Aeon. Memory: 21 MB, Time: 1.2 s на худшем случае.

Tags взаимно простые числа, запросы, задачи на отрезках

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
ru3 Russian dmkz 2018-06-09 20:12:49 111
en2 English dmkz 2018-06-09 20:11:51 115 Tiny change: 'n~~~~~\n\n' -> 'n~~~~~\n\n\nUPD: solved by [user:AeonHQ]\n'
ru2 Russian dmkz 2018-06-09 11:31:49 4 Мелкая правка: 'с, памяти 64 MB.\n\nЗа' -> 'с, памяти 32 MB.\n\nЗа'
ru1 Russian dmkz 2018-06-08 20:58:39 1470 Первая редакция перевода на Русский
en1 English dmkz 2018-06-08 15:28:22 811 Initial revision (published)