【分析】
假设我们已经确定了一个分数为a/b,则我们可以通过串并联获得两个新的分数a+b/b或者b/a+b,这时我们可以逆推,从最终的“结果分数”回溯到1/1(或者直接回溯到0)。我们还可以得到一个方便运算的结论,如果数为倒数,结果不变。
可以直接所有分数改为假分数,再不停的减一,重复上述操作。方便的可以用除法来加快运算。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
long long T;
long long gcd(long long a,long long b){
while(b!=0){
long long tmp=a%b;
a=b,b=tmp;
}
return a;
}
int main(){
freopen("capacitor.in","r",stdin);
freopen("capacitor.out","w",stdout);
cin>>T;
while(T--){
static long long a,b,ans;
cin>>a>>b;
ans=0;
static long long d;
d=gcd(a,b);
a/=d,b/=d;
while(a!=0&&b!=0){
if(a>b){
ans+=a/b;
a%=b;
}
else {
swap(a,b);
ans+=a/b;
a%=b;
}
}
cout<<ans<<endl;
}
return 0;
}