题意
给定一个数列,我们定义一个操作是取相邻的两个数计算其 gcd ,然后替换掉其中的某一个数,问最少多少步可以将数列全部变为 1 。
题解
如果数组中有1,则答案为n - 1的个数;如果数组中没有1,则通过每一个往后遍历找到最短能得到1的step,则答案为n-1+step;如果数组的所有数的gcd找不出1的话就是输出-1。
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int num[2005];
int gcd(int a, int b)
{
int t = 0;
while(a != 0)
{
t = b%a;
b = a;
a = t;
}
return b;
}
int main()
{
int n;
while(cin>>n)
{
int num_one = 0, min_gcd = 0, step = INF;
for(int i = 0; i < n; i++)
{
cin>>num[i];
if(num[i] == 1)
num_one++;
}
for(int i = 0; i < n; i++)
{
min_gcd = 0;
for(int j = i; j < n; j++)
{
if((min_gcd = gcd(min_gcd, num[j])) == 1)
{
step = min(step, j-i);
j = n;
}
}
}
if(num_one)
{
cout<<n-num_one<<endl;
}
else
{
if(step!=INF)
{
cout<<n-1+step<<endl;
}
else
{
cout<<"-1"<<endl;
}
}
}
}