capacitor

这里写图片描述
这里写图片描述
这里写图片描述


【分析】

假设我们已经确定了一个分数为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;
}

猜你喜欢

转载自blog.csdn.net/xyc1719/article/details/81669222