可划分数组
题号:NC289482
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

\hspace{15pt}给你一个由 n 个整数组成的数组 \{a_1,a_2,\dots,a_n\},现在你需要将数组划分出尽可能多的区间(假设划分为 k 段),每段区间需要满足:
\hspace{23pt}\bullet\,每一段区间的长度都要大于等于 2,我们使用 l_ir_i 表示第 i 段区间的左右端点,需要满足 r_i - l_i + 1\geq 2
\hspace{23pt}\bullet\,第一段区间的左端点必须为 1,第 k 段区间的右端点必须为 n
\hspace{23pt}\bullet\,对于第 i \left(2\leq i\leq k\right) 段区间,满足 l_i = r_{i-1}+1
\hspace{23pt}\bullet\,每段区间内的每个数,都能够在当前区间中找到至少一个除了自己之外的数字,与它不互质;换句话来说,对于第 i 段区间的任意一个元素 x \left(l_i\leq x\leq r_i\right),都至少存在一个 y 满足 l_i\leq y\leq r_iy\ne x,并且 \gcd(a_x,a_y)\ne 1

\hspace{15pt}你只需要直接输出满足要求的最多段数,即最大化 k,而不需要输出具体的划分方案。如果无法划分出满足要求的区间,则直接输出 -1

输入描述:

\hspace{15pt}第一行输入一个整数 n\left(1\leq n\leq 2\times 10^3\right) 代表数组中的元素数量。 
\hspace{15pt}第二行输入 n 个整数 a_1,a_2,\dots,a_n\left(1\leq a_i\leq 10^9\right) 代表数组中的元素。

输出描述:

\hspace{15pt}如果无法划分出满足要求的区间,则直接输出 -1;否则,输出一个整数,代表满足要求的最多段数。
示例1

输入

复制
7
2 2 3 3 4 8 4

输出

复制
3

说明

\hspace{15pt}在这个样例中,唯一满足条件的划分方案为:\{2,2\} + \{3,3\} + \{4,8,4\}
示例2

输入

复制
7
5 5 3 3 5 8 4

输出

复制
2

说明

\hspace{15pt}在这个样例中,唯一满足条件的划分方案为:\{5,5,3,3,5\} + \{8,4\}
示例3

输入

复制
1
4

输出

复制
-1

说明

\hspace{15pt}由于区间长度必须大于等于 2,所以无法划分出满足要求的区间。
示例4

输入

复制
5
1 2 3 4 5

输出

复制
-1