題意:給你n個正整數a1...an,一次操做是選擇任意兩個數ai,aj,將它們都替換成gcd(ai,aj)。讓你在5n步內將全部數變爲1。或者輸出不可能。spa
若是全部數的gcd不爲1,顯然不可能。blog
不然從a1開始,一路和下一個數取上gcd,必定能在某個時刻,讓a1這個數變成1。it
而後就好辦了,再讓a2...an分別與a1取上gcd,就全變成1了。io
不超過2n步。class
#include<cstdio> #include<algorithm> using namespace std; int n,a[100005]; int main(){ //freopen("g.in","r",stdin); int zu=0; while(scanf("%d",&n)!=EOF){ printf("Case %d: ",++zu); for(int i=1;i<=n;++i){ scanf("%d",&a[i]); } int now=a[1],ans; for(int i=2;i<=n;++i){ now=__gcd(now,a[i]); if(now==1){ ans=i-1; break; } } if(now!=1){ puts("-1\n"); continue; } printf("%d\n",ans+n-1); for(int i=2;i<=ans+1;++i){ printf("%d %d\n",1,i); } for(int i=2;i<=n;++i){ printf("1 %d\n",i); } puts(""); } return 0; }