版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41709770/article/details/82933450
题目
题解
–不是很难,只需要推一推小小的公式就好
显然:
= (
1 )/(
+ 1) (串联)
=
+1 (并联)
所以说,对于一对a,b,我们可以先用gcd化简
然后就用类似辗转相除法的思想,每次对大的那个用小的那个除,加入答案后再取余
直到a==b
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=1;
int t;
long long a,b;
long long ans;
long long gcd(long long a,long long b){
if(!b)
return a;
return gcd(b,a%b);
}
int main(){
// freopen("capacitor.in","r",stdin);
// freopen("capacitor.out","w",stdout);
cin>>t;
while(t--){
scanf("%lld%lld",&a,&b);
long long g=gcd(a,b);
a/=g;
b/=g;
ans=0;
while(1){
if(b==1){
ans+=a;
break;
}
ans+=a/b;
a%=b;
if(a==1){
ans+=b;
break;
}
ans+=b/a;
b%=a;
}
printf("%lld\n",ans);
}
return 0;
}