capacitorcapacitorcapacitor
输入
输出
样例输入1
2
1 1
3 2
样例输出1
1
3
样例输入2
2
6 5
199 200
样例输入2
6
200
数据范围
思路
这道题要用数论来做。
我们先把分数化简,然后一步一步逆推回去,找到所需步数最少的那种,然后就可以了。
代码
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
ll t, ans, a, b, gcd;
ll get_gcd(ll a, ll b) {//求出最大公因数
ll x = a, y = b, r = x % y;
while (r)
{
x = y, y = r;
r = x % y;
}
return y;
}
int main() {
// freopen("capacitor.in","r",stdin);
// freopen("capacitor.out","w",stdout);
scanf("%lld", &t);//读入
for (ll i = 1; i <= t; i++) {
ans = 0;//初始化
scanf("%lld %lld", &a, &b);//读入
gcd = get_gcd(a, b);//求出最大公因数
a /= gcd;//化简成最简分分数
b /= gcd;
if (a < b) swap(a, b);//我们让a一直为最大
while (b != 1) {
a -= b;//减
ans++;//记录减的次数
if (a < b) swap(a, b);//要一直让a为最大
}
printf("%lld\n",a + ans);//输出
}
// fclose(stdin);
// fclose(stdout);
return 0;
}