我们应该找能gcd得出1的最小区间,得出他们的距离,这个距离就是将这个小区间变出一个1所需要的步数,只要能得出一个1,再需要n-1步就可以将整个区间变为1了
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=2010;
const int inf=0x3f3f3f3f;
int num[maxn];
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
int main(){
int n;
while(cin>>n){
int cnt_1=0;
int ans=inf;
for(int i=0;i<n;i++){
cin>>num[i];
if(num[i]==1) cnt_1++;
}
if(cnt_1){
cout<<n-cnt_1<<endl;
}
else{
for(int i=0;i<n;i++){
int x=num[i];
for(int j=i+1;j<n;j++){
x=gcd(x,num[j]);
if(x==1){
ans=min(ans,j-i);
}
}
}
if(ans==inf) cout<<-1<<endl;
else cout<<ans+n-1<<endl;
}
}
}