题目
题解
–不是很难,只需要推一推小小的公式就好
显然:
m
n
\frac{m}{n}
nm = (
m
n
−
m
\frac{m}{n-m}
n−mm
×
\times
× 1 )/(
m
n
−
m
\frac{m}{n-m}
n−mm + 1) (串联)
m
+
n
n
\frac{m+n}{n}
nm+n =
m
n
\frac{m}{n}
nm+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;
}