http://codeforces.com/contest/892/problem/C
题意:每次操作两个相邻的数字取gcd取代其中一个,问最后全部化为1需要多少次。
做法:如果有相邻的两个数他们的素因子有不同的地方,那么这两个数有可能化为1,只要从第二个数后能够把第二个数的素因子削去一部分,那么就可以变为1。
那么不为-1的条件就是他们所有的gcd为1,就代表有不同的素因子。另外这个题n很小,可以达到n^2的复杂度,那么对于一个数,枚举他后面的数,如果构造出
gcd==1,那么就可以得到答案,另外就是不断更新答案取最小。
import java.util.Scanner;
//ctrl shift o
public class Main {
public static int gcd(int a,int b) {
if(a<b) return gcd(b,a);
if(a%b==0)
return b;
return gcd(b,a%b);
}
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int n=input.nextInt();
int []a=new int [n];
int sum=0;
int f=0;
for(int i=0;i<n;i++){
a[i]=input.nextInt();
if(a[i]==1) {
sum++;
}
}
int xx=a[0];
for(int i=1;i<n;i++) {
xx=gcd(xx,a[i]);
}
if(xx!=1) {
System.out.println(-1);
return ;
}
if(sum>0) {
System.out.println(n-sum);
return ;
}
int ans=1<<30-1;
for(int i=0;i<n;i++) {
int twh=a[i];
for(int j=i+1;j<n;j++) {
twh=gcd(twh,a[j]);
if(twh==1) {
ans=Math.min(ans,j-i);
}
}
}
System.out.println(n+ans-1);
}
}