Codeforces 837E Vasya's Function

837E - Vasya's Function

题意:定义函数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的情况,很好证明,请读者自行证明。

原文地址:https://www.cnblogs.com/widsom/p/7285749.html