jzojcapacitor【数论】【DFS】

>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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值