GCD-题解

原题链接:Link

题目描述

求区间 GCD 等于特定值的区间个数。

思路分析

首先我们解决区间 GCD 的问题。

定义 \(gcdRange(l, r)\) 表示区间 \([l, r]\) 所有数的 GCD 。容易发现这个函数是有结合律的,而且哪怕两个区间有部分重叠仍适合结合律,所以可以使用 ST 表维护,只要把原来的 max 换成 gcd 就行了。

然后考虑计数。区间 GCD 有两个特点:

  1. 能取到的值并不多。一个数的因数本来就少,多个数的公因数就更少了。
  2. 区间变宽, GCD 只减不增。

这样,如果我们固定区间的左端点,让右端点不断增加,此时 \(gcdRange(l, r)\) 会递减,又由于能取的值不多,将会出现大量的重复 GCD 值。运用二分方法求出这些连续 GCD 值的区间,就在较短的时间里完成了统计。

如果设值域为 \(W\),可以预料到 GCD 值的取值数量在 \(\log W\) 级别,总复杂度是 \(n \log W \log n\)

AC代码