题意:有无数个单位1的电阻 要求每次用单位电阻和构造的电阻并联或者串联 求阻值为a/b(a,b<=1e18)最小需要消耗多少个电阻?
首先并联总电阻小于任意一个分电阻得:如果当前电阻小于1,则最后步骤为并联,否则为串联
迭代直到a或者b==1即可 迭代时发现竟然是求gcd的过程(表示好神奇..),复杂度为O(log(max(a,b)))
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e3+30;
ll gcd(ll a,ll b)
{
if(a%b==0)
return b;
return gcd(b,a%b);
}
int main()
{
ll a,b;
while(cin>>a>>b)
{
ll ans=0;
while(a!=1&&b!=1)
{
if(a==b)
break;
if(a>b)
{
//R总>1肯定为和1串联
ll x=a/b;
ans+=x;
a=a-b*x;
}
else
{
//R总<1,要想和1并联成b/a,则原来电阻为a/(b-a)
a=a;
//b=b-a; b每次减少了a 直到a>=b
ll k=b-a;//和a的差距
ll x=k/a;
if(k%a)
x++;
b-=x*a;
ans+=x;
}
}
if(a==1)
ans+=b;
else if(b==1)
ans+=a;
cout<<ans<<endl;
}
return 0;
}