题目大意:
给你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;
}