Mad scientist Mike is building a time machine in his spare time. To finish the work, he needs a resistor with a certain resistance value.
However, all Mike has is lots of identical resistors with unit resistance R0 = 1. Elements with other resistance can be constructed from these resistors. In this problem, we will consider the following as elements:
- one resistor;
- an element and one resistor plugged in sequence;
- an element and one resistor plugged in parallel.

With the consecutive connection the resistance of the new element equals
R = Re + R0. With the parallel connection the resistance of the new element equals
. In this case
Re equals the resistance of the element being connected.
Mike needs to assemble an element with a resistance equal to the fraction .
Determine the smallest possible number of resistors he needs to make such an element.
The single input line contains two space-separated integers
a and b (1 ≤ a, b ≤ 1018). It is guaranteed that the fraction
is irreducible. It is guaranteed that a solution always exists.
Print a single number — the answer to the problem.
Please do not use the %lld specifier to read or write 64-bit integers in С++. It is recommended to use the cin, cout streams or the %I64d specifier.
1 1
1
3 2
3
199 200
200
In the first sample, one resistor is enough.
In the second sample one can connect the resistors in parallel, take the resulting element and connect it to a third resistor consecutively. Then, we get an element with resistance
. We cannot make this element using two resistors.
用最少的阻值为1的电阻来构成一个网络,使得其总阻值为a/b。我们可以并联,也可以串联。
思路:
1、通过枚举几种情况我们贪心去处理,发现:
①如果a/b>1,那么我们用一个阻值为1的串联起来,此时剩余要处理的阻值为(a-b)/b.那么如果此时(a-b)/b仍然大于1.那么我们继续用一个阻值为1的串联起来,直到我们a/b<1为止。
②那么如果a/b<1(a<b),那么我们考虑并联一堆电阻的同时再串联起来一个阻值为1的电阻,和上述串联过程相似,直到我们再有a/b>1的时候停止。
③那么考虑整个过程,其实就是搞,用a,b中较大值不断的减去a,b中的较小值,直到不能减为止(一方变成了1,那么此时考虑并联较大值个电阻即可)。
2、那么我们接下来模拟这个过程即可:
①如果a==b输出1即可。
②设定output=0;
③如果a>b,swap(a,b)【我们保证a是较小值好处理】;
④如果a==1停止过程,output+=b;如果a!=1,那么对应output+=b/a;b%=a;
Ac代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll __int64
int main()
{
ll a,b;
while(~scanf("%I64d%I64d",&a,&b))
{
if(a==b)
{
printf("1\n");
continue;
}
ll output=0;
while(1)
{
if(a>b)swap(a,b);
if(a==1)break;
else
{
output+=b/a;
b%=a;
}
}
output+=b;
printf("%I64d\n",output);
}
}