ZOJ 3846GCD Reduce(数学)

来源:互联网 发布:混合蛙跳算法有什么用 编辑:程序博客网 时间:2024/06/06 18:49

给出一个序列,你可以将任意两个数字替换成他们的最大公约数,问需要几次操作可以都变成1.

可以知道该问题有解的充必条件为gcd(a1,a2,a3....an)=1,



#include<iostream>#include<cstdio>#include<set>#include<string>#include<string.h>#include<cstring>#include<vector>#include<map>#include<queue>#include<stack>#include<cctype>#include<algorithm>#include<sstream>#include<utility>#include<cmath>#include<functional>#define mt(a) memset(a,0,sizeof (a))#define fl(a,b,c) fill(a,b,c)#define SWAP(a,b,t) (t=a,a=b,b=t)#define inf 1000000000+7using namespace std;typedef long long ll;#define sp system("pause")int aa[100000+20];int ansa[100000*3];int ansb[100000*3];int gcd(int x,int y){return y==0?x:gcd(y,x%y);}int main(){int n;int cot=0;while(cin>>n){cot++;int flag=0,ans=-1;scanf("%d",&aa[0]);int gc=aa[0];int number=0;if(gc==1)flag=1;for(int i=1;i<n;i++){scanf("%d",&aa[i]);gc=gcd(gc,aa[i]);if(gc==1)flag=1;}if(!flag){printf("Case %d: -1\n",cot);}else {printf("Case %d: %d\n",cot,2*(n-1));for(int i=1;i<n;i++){printf("%d %d\n",i,i+1);}for(int i=n-1;i>=1;i--){printf("%d %d\n",i,i+1);}}cout<<endl;}return 0;}


0 0
原创粉丝点击