洛谷P2090《数字对》
十一月 01, 2019
1676
更相减损术
题目描述
对于一个数字对(a, b),我们可以通过一次操作将其变为新数字对(a+b, b)或(a, a+b)。
给定一正整数n,问最少需要多少次操作可将数字对(1, 1)变为一个数字对,该数字对至少有一个数字为n。
输入格式
第一行一个正整数 n
输出格式
一个整数表示答案。
输入输出样例
输入 #1
1 |
|
输出 #1
1 |
|
说明/提示
样例解释:
(1,1) → (1,2) → (3,2) → (5,2)
对于30%的数据, 1 <= n <= 1000
对于60%的数据, 1 <= n <= 20000
对于100%的数据,1 <= n <= 10^6
解析
先手玩一下样例,发现式子是这样的:
反过来写
这个不是。。。更相减损术?
所以题目就转化成了:找到一个数字对 使得 gcd(n, a)
进行更相减损的次数最小。
考虑枚举 ,上界怎么确定?
手玩的时候顺便发现从 分出的两条分支是对称的,那么超出 的枚举是没有必要的,所以
每一次 gcd
传下去的参数都是 b,a mod b
,更相减损了 次, 每次步数要加上这个数;
最后如果 ,那么步数要另加上 (从 转移到 需要 步);
最后如果 那就无解,直接 return inf
别让答案更新就好
代码实现
1 |
|
- 本文作者:Handwer STD
- 本文链接:https://blog.handwer-std.top/2019-11-01/Luogu-P2090/index.html
- 版权声明:本博客所有文章均采用 BY-NC-SA 许可协议,转载请注明出处!