【推導】zoj3846 GCD Reduce

題意:給你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;
}
相關文章
相關標籤/搜索