题目链接 :
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5440
题意:
给定一个长度为n的数列每次可以选个二元组(a[i],a[j])换成他们的最大公约数
然后问能不能再5*n次操作内把他们全部换成1,
分析:
因为每次操作都是换成GCD 因此n数的GCD肯定为1,如果不为1的话肯定不能变成1的
然后随便构造一种方法就行了,从1到n搞两遍 一定可以全变成1;
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1e5+10;
int a[maxn];
int gcd(int a,int b)
{
if(b) return gcd(b,a%b);
return a;
}
int main()
{
int cas=1,n;
while(~scanf("%d",&n)){
int mmin = 1999999999,num=0;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
if(a[i]<mmin) mmin = a[i];
}
int tmp=a[0];
for(int i=1;i<n;i++)
tmp=gcd(tmp,a[i]);
printf("Case %d: ",cas++);
if(tmp!=1){
puts("-1");
puts("");
continue;
}
else{
printf("%d\n",2*n-2);
for(int i=1;i<n;i++)
printf("1 %d\n",i+1);
for(int i=1;i<n;i++)
printf("1 %d\n",i+1);
puts("");
}
}
return 0;
}