传送门:点击打开链接
两个递归,如果单纯的跑数据,第三组示例都过不了,别问我为什么。所以要选择优化,可以发现,在F的计算中,每一次的递归都牵扯到gcd(a,b),那么不妨把a,b划到最简,什么算最简形式,就是互质呗,这是一个困难的过程。枚举a的因子,让b除去b中所有跟a相等的因子,然后取所偶有数的最小值,看起来很麻烦,其实只需要b%a的因子取min就可以。如果a没有任何因子,也就是a是质数时结束循环,此时要再取一次tempb跟b%a的最小值,不然第14组数据都过不去,别问我为什么。最后运行时间30ms,还可以。注意所有的数据最好都用long long。
代码实现:
#include<iostream>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
ll gcd(ll x,ll y)
{
if(x==0)
return y;
return gcd(y%x,x);
}
ll find(ll x,ll y)
{
if(y==0)
return 0;
ll temp=gcd(x,y);
x/=temp;y/=temp;
ll tempa=x,tempb=y;
for(ll i=2;i*i<=x;i++)
{
if(x%i)
continue;
tempb=min(tempb,y%i);
while(x%i==0)
x/=i;
}
if(x!=1)
tempb=min(tempb,y%x);
return find(tempa,y-tempb)+tempb;
}
int main()
{
ll a,b;
while(cin>>a>>b)
{
ll sum=find(a,b);
cout<<sum<<endl;
}
return 0;
}