这是本人的代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a,b,ans,k1,k2,k3,k4,k5,k6;
void dfs(int X,int Y){
if(X<1)return;
if(X==Y){
ans+=X;
k1=X;
return;
}
k1=__gcd(X,Y);
X/=k1;
Y/=k1;
k3=Y-X;
k4=k3;
k5=0;
for(int i=1;i*i<=k3;i++){
if(k3%i!=0)continue;
k5++;
if(i!=1&&X%i>0)k4=min(k4,X%i);
if(X%(k3/i))k4=min(k4,X%(k3/i));
if(k4==1)break;
}
ans+=k4;
dfs(X-k4,Y-k4);
return;
}
signed main(){
scanf("%lld%lld",&a,&b);
k1=__gcd(a,b);
a/=k1;
b/=k1;
if(a==b){
puts("1");
return 0;
}
if(a>b)swap(a,b);
dfs(a,b);
printf("%lld",ans);
return 0;
}
大致思路是每次把两个数的gcd除掉,然后枚举两数之差的因数,来算离二者最近的公约数在哪里,然后减掉。按理来讲gcd每次>=2,复杂度应该不超过Θ(logn×n) 才对,但是33AC,8TLE