>Description
>Input
>Output
>Sample Input
>Sample Output
>解题思路
我看到这个题目就想到了capper这也太像了吧
题目描述:
每个电容
x
/
y
x/y
x/y 只能与 1皮法的电容进行并联或串联,因此,
并联变为(
x
/
y
x/y
x/y 并联1):
x
/
y
+
1
x/y+1
x/y+1,化简为
(
x
+
y
)
/
y
(x+y)/y
(x+y)/y
串联变为(
x
/
y
x/y
x/y 串联1):
1
/
(
1
/
(
x
/
y
)
+
1
)
1/(1/(x/y)+1)
1/(1/(x/y)+1),化简为
x
/
(
x
+
y
)
x/(x+y)
x/(x+y)
所以,我们就可以“倒着”递归回去,由现在的 a / b a/b a/b 最终结果,通过上面的公式倒推到 1 / 1 1/1 1/1 初始状态,递归过程中记录答案。然后我只用了并联这个公式,串联的公式不用鸟。
解方程:
a,b已知(当前的电容),求 x,y(上一个电容)
a = x + y, b = y
x = a - b, y = b
最后,数太大,需要化成最简分数。
>代码
#include <iostream>
#include <cstdio>
#include <cmath>
#define ll long long
using namespace std;
ll t, x, y;
ll gcd (ll a, ll b)
{
if (b == 0) return a;
return gcd (b, a % b);
} //求gcd
ll dfs (ll xx, ll yy)
{
if (xx < yy) swap (xx, yy); //维持假分数
if (yy == 1) return xx;
return dfs (xx - yy, yy) + 1; //电容数+1
}
int main()
{
// freopen ("capacitor.in", "r", stdin);
// freopen ("capacitor.out", "w", stdout);
scanf ("%lld", &t);
for (ll i = 1; i <= t; i++)
{
scanf ("%lld%lld", &x, &y);
ll g = gcd (x, y);
x /= g;
y /= g;
printf ("%lld\n", dfs (x, y));
}
return 0;
}