真的是。。。智商捉急就是这个样子。。。
刚开始的想法是把数列排序,排完之后把第一个数和后面的数比较,如果有互质的,就处理这两个,然后再用第一个和其他的进行处理,总共是n-1次操作。如果都没有和他互质的,那就-1.原先这样想是觉得,因为第一个最小,所以后面的如果和他不是互质的,都可以写成a[1]*x的形式,所以如果都不互质的话,其他的数也不会互质。。。。但是。。。谁说两个数GCD一定是小的那个数了。。。。蠢。。QAQ。
恩,,所以就是要变成GCD(1,2),GCD(2,3)...这样就是所有数的公约数了,如果为1,则有解。
然后这样的解法就是2*(n-1)次操作。。。。
#include <stdio.h>
#define maxn 100010
int a[maxn];
int gcd(int a,int b)
{
if(b==0)
return a;
return
gcd(b,a%b);
}
int main()
{
int cas=0,n;
while(scanf("%d",&n)!=EOF)
{
++cas;
int i,j,k;
int res;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(i==2) res=gcd(a[i],a[i-1]);
else if(i>2) res=gcd(res,a[i]);
}
printf("Case %d: ",cas);
if(res!=1) printf("-1\n");
else
{
printf("%d\n",2*(n-1));
for(i=2;i<=n;i++)
printf("1 %d\n",i);
for(i=2;i<=n;i++)
printf("1 %d\n",i);
}
printf("\n"); //然后这里注意输出的格式,之前是在case前输出换行的,就错了。
}
return 0;
}