所有子段的最大公约数

Go Hard math

任务 «所有子段的最大公约数»

给定一个长度为 n 的整数数组 a。需要对于每个可能的子段 [l, r](1 ≤ l ≤ r ≤ n),计算该子段元素的最大公约数(GCD)。然后在所有得到的 GCD 中,找出不同值的数量。要求实现一个高效算法,考虑到 n 最多可达 100000,数组元素最多可达 10^9。

输入格式

第一行包含一个整数 n (1 ≤ n ≤ 100000)。第二行包含 n 个整数 a_i (1 ≤ a_i ≤ 10^9),用空格分隔。

输出格式

输出一个整数——数组所有子段中不同GCD值的数量。

示例

示例 1

输入
3 6 10 15
输出
6

示例 2

输入
4 2 4 8 16
输出
4

示例 3

输入
5 7 14 21 28 35
输出
5

示例 4

输入
5 10 15
输出
3
main.go