\(НОД\) (или \(gcd\) - наибольший общий делитель двух чисел. То есть для \(a,b\), \(gcd(a,b)\) - максимальное \(p\), что \( a \% p = 0, b \% p = 0\).
Пускай дан массив \(a\) длины \(n\), где \( a_i \le C \). Асимптотика поиска НОД массива (наибольшее число, являющееся делителем каждого числа массива) будет не \(O( n \log{C})\), как может показаться, а \(O( \log{C} + n)\)
Дан массив натуральных чисел \(a_1, a_2... a_n\). Необходимо посчитать сумму по всем \(f(l,r) = gcd(a_l,a_{l+1}...a_r) \).
Зафиксируем \(r\). Выпишем все \(f(l,r)\) по убыванию \(l\):
Тогда мы можем перебрать все \(r\) и поддерживать все суффиксы, заканчивающиеся в \(r\) в т.н. gcd-стеке. Пусть уже посчитан \(gcdStack\) для \(r-1\), тогда ко всем суффиксам применим \( gcdStack[j] := gcd( gcdStack[j], a_r )\). Также добавим еще один суффикс - само \(a_r\). Удалим повторения и получим корректный gcd-стек.
Так мы получили оценку количеству уникальных НОД на всех отрезках - \(O(n*\log{n})\). Теперь для решения задачи достаточно поддерживать gcd-стек и определять сколько суффиксов имеют такой-то НОД.
Пускай надо уметь отвечать на запросы НОД на отрезке, а также уметь прибавлять на отрезке. Тогда построим разностный массив \(b\), \(b_i = a_i - a_{i-1}, i>1\), поверх нашего массива \(a\).
Очевидно, что \( gcd(a_l,a_{l+1}...a_r) = gcd(a_l, a_{l+1}-a_l ... a_r - a_{r-1} ) \). А это тоже самое, что \( gcd(a_l, b_{l+1}...b_r) \).
Чтобы прибавлять на разностном массиве достаточно изменить два элемента в точке, что не составляет труда.