题目描述
对于一个数字对(a, b),我们可以通过一次操作将其变为新数字对(a+b, b)或(a, a+b)。
给定一正整数n,问最少需要多少次操作可将数字对(1, 1)变为一个数字对,该数字对至少有一个数字为n。
输入输出格式
输入格式:
第一行一个正整数 n
输出格式:
一个整数表示答案。
输入输出样例
输入样例#1: 复制
5
输出样例#1: 复制
3
说明
样例解释:
(1,1) → (1,2) → (3,2) → (5,2)
对于30%的数据, 1 <= n <= 1000
对于60%的数据, 1 <= n <= 20000
对于100%的数据,1 <= n <= 10^6
正着推除了dfs没什么花头,所以只能逆向思维,倒着推
枚举答案(n,i),因为答案要最小方案,所以 1<i<n;
(a,b)——>(a,b-a)直到b<a为止
这像辗转相减法,可以改成辗转相除法
#include<cstdio>
#include<iostream>
using namespace std;
int ans;
inline int sum(int a,int b)
{
if(!b) return 2e9;
if(b==1) return a-1;
return sum(b,a%b)+a/b;
}
int main()
{
int n; ans=2e9;
scanf("%d",&n);
for(int i=1;i<n;i++)
ans=min(ans,sum(n,i));
printf("%d\n",ans);
return 0;
}