zoukankan      html  css  js  c++  java
  • 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的情况,很好证明,请读者自行证明。

  • 相关阅读:
    bzoj 1497: [NOI2006]最大获利
    bzoj 2733: [HNOI2012]永无乡
    [CF911G]Mass Change Queries
    [CF911F]Tree Destruction
    [CF911E]Stack Sorting
    [CF911D]Inversion Counting
    [CF911C]Three Garlands
    [CF911B]Two Cakes
    [CF911A]Nearest Minimums
    [POJ1201]Intervals
  • 原文地址:https://www.cnblogs.com/widsom/p/7285749.html
Copyright © 2011-2022 走看看