>Description
>Input
>Output
>Sample Input
>Sample Output
>解题思路
我看到这个题目就想到了capper这也太像了吧
题目描述:
每个电容 x/yx/yx/y 只能与 1皮法的电容进行并联或串联,因此,
并联变为(x/yx/yx/y 并联1):x/y+1x/y+1x/y+1,化简为 (x+y)/y(x+y)/y(x+y)/y
串联变为(x/yx/yx/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/ba/ba/b 最终结果,通过上面的公式倒推到 1/11/11/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;
}