Codeforces 134 B. Pairs of Numbers

問題

数のペア(a,b)にを、(a+b,b)または(a,a+b)にかえる操作をすることができる。
(1,1)から始めて、ペアのどちらかの数がnになるのに必要な操作の最小回数を求めよ。

制約条件

n≦10^6

方針

逆からやる。
(a,b)の前の形はa>bなら(a-b,b)、a<bなら(a,b-a)と一通りに定まる。


最後は(a,n)の形になっているはずなので、aの値を1からnまで全部試す。
ただし、gcd(a,n)=1でないと(1,1)まで戻れないので、gcd(a,n)=1であるaだけを全部試す。


再帰でやったら手元ではスタックオーバーフローで落ちた。
ループで書く必要がある(?)

ソースコード

void run()
{
	int n; cin>>n;
	int ans=inf;
	for(int i=1;i<n;i++)if(__gcd(i,n)==1){
		int t=0,a=i,b=n;
		while(a!=b){
			if(a>b)a=a-b;
			else b=b-a;
			t++;
		}
		ans=min(ans,t);
	}
	cout<<(n==1?0:ans)<<endl;
}