发现如果给定两个数(a,b),可以用类似辗转相除法在logn的时间内计算出(反向)变到(1,1)的最小步数。
然而并不知道另一个数是多少?
暴力嘛,枚举一下另一个数,反正1000000的nlogn不虚啊
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int calc(int a,int b) 5 { 6 int ans=0,t; 7 while(a!=1||b!=1) 8 { 9 if(a<b) swap(a,b); 10 if(a==b) return 0x3f3f3f3f; 11 t=(a-1)/b;ans+=t; 12 a-=t*b; 13 } 14 return ans; 15 } 16 int n,ans=0x3f3f3f3f; 17 int main() 18 { 19 int i; 20 scanf("%d",&n); 21 for(i=1;i<=3000000;i++) ans=min(ans,calc(i,n)); 22 printf("%d",ans); 23 return 0; 24 }