题意:定义函数f(x,y):f(x,0)=0,f(x,y)=1+f(x,y-gcd(x,y)),给你x,y,求f(x,y)。
思路:x=X*gcd(x,y),y=Y*gcd(x,y),X与Y互质。y-gcd(x,y)=(Y-1)*gcd(x,y),如果X和Y-1还互质,那么下一次的gcd还是等于gcd(x,y)。
那么就需要找一个最小的t,使得X和Y-t不互质(有公因子),即(Y-t)%d=0,其中d为X的任意一个因子。
Y%d-t%d=0 ==> Y%d=t ==> t=Y%d。
这样新的gcd等于原来的gcd(x,y)*d,X=X/d,Y=(Y-t)/d。
这样一直找下去,直到Y等于0,所有的t加起来也就是答案。
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back vector<ll>a; int main() { ios::sync_with_stdio(false); cin.tie(0); ll x,y; cin>>x>>y; ll g=__gcd(x,y); x/=g,y/=g; for(ll i=2;i*i<=x;i++) { while(x%i==0) { x/=i; a.pb(i); } } if(x>1)a.pb(x);//预处理x的所有因子,保存在容器a中 ll ans=0; while(y) { ll g=y;//g也就是思路中的t for(ll i:a)g=min(g,y%i); ans+=g; y-=g; vector<ll>b; for(ll i:a) { if(y%i==0)y/=i;//把y中包含a的公因子都除掉 else b.pb(i); } a.swap(b); } cout<<ans<<endl; return 0; }
另外补充一下一个小知识:a%b=1等价于a%d=1(d是b的任意一个质因子),对应于上面t=1的情况,很好证明,请读者自行证明。