洛谷 P2090 数字对

发现如果给定两个数(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 }
原文地址:https://www.cnblogs.com/hehe54321/p/8621408.html