标签:
题目链接 :
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; }
标签:
原文地址:http://blog.csdn.net/bigbigship/article/details/42612437