題目大意:
給你n個數,讓你進行操作,操作是對兩個數取他們的gcd,這個gcd可以將這兩個數其中一個替換掉,問將所有的數字變爲1最少需要多少次操作
解題思路:
我們應該找能gcd得出1的最小區間,得出他們的距離,這個距離就是將這個小區間變出一個1所需要的步數,只要能得出一個1,再需要n-1步就可以將整個區間變爲1了
代碼:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n,arr[2020],cnt=0;
int gcd(int a,int b)
{
if(a<b)
{
int temp=a;
a=b;
b=temp;
}
while(b)
{
int temp=a%b;
a=b;
b=temp;
}
return a;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &arr[i]);
if (arr[i] == 1) cnt++;
}
if (cnt) {
printf("%d", n - cnt);
return 0;
}
int m = 0x3f3f3f3f;
for (int i = 1; i < n; ++i)
{
int g=arr[i];
for(int j=i+1;j<=n;++j)
{
g=gcd(g,arr[j]);
if(g==1)
{
m=min(m,j-i+n-1);
break;
}
}
}
if(m==0x3f3f3f3f) puts("-1");
else printf("%d",m);
return 0;
}