思路是要求的不就是一个连续区间使一个区间所有数的gcd为 1 的最小长度吗
那我们只要从区间长度入手,每次枚举出长度为 2,3,......,n 的连续区间,再来统计它们的 gcd 是否为 1,就可以保证我们第一次找出的答案即为最优
(第k长度的gcd = gcd(k-1长度的gcd,a[i+k]))
(用 rec 滚动数组来记录上一长度的gcd)
#include <bits/stdc++.h>
#define __init ios::sync_with_stdio(false);cin.tie(0), cout.tie(0)
using namespace std;
const int MAXN = 1e5;
int n, a[MAXN], rec[MAXN][2]; // rec 滚动数组
signed main() {
__init;
cin >> n;
int cnt = 0;
bool flag = 1;
for(int i = 0;i < n;i++) {
cin >> a[i];
cnt += (a[i] == 1);
}
if(cnt) {
cout << n-cnt;
return 0;
}
for(int i = 0;i < n-1;i++) {
rec[0][i] = __gcd(a[i], a[i+1]);
if(rec[0][i] == 1) {
cout << n;
return 0;
}
}
for(int w = 2;w < n;w++) {
for(int i = 0;i < n-w;i++) {
rec[flag][i] = __gcd(rec[(flag ? 0 : 1)][i], a[i+w]);
if(rec[flag][i] == 1) {
cout << n-1+w;
return 0;
}
}
flag = (flag ? 0 : 1);
}
cout << -1;
return 0;
}