zoukankan      html  css  js  c++  java
  • 拓展欧几里得 专题

    大神orz(具体参考请点这)

    我根据个人感觉弄了一下自己的思路

    ZOJ 3609 :http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4712 求最小逆元,坑点就是对m=1的特判

    /**************************************************************
        Problem:zoj 3609
        User: youmi
        Language: C++
        Result: Accepted
        Time:0s
        Memory:272kb
    ****************************************************************/
    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    //#include<bits/stdc++.h>
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <map>
    #include <stack>
    #include <set>
    #include <sstream>
    #include <cmath>
    #include <queue>
    #include <deque>
    #include <string>
    #include <vector>
    #define zeros(a) memset(a,0,sizeof(a))
    #define ones(a) memset(a,-1,sizeof(a))
    #define sc(a) scanf("%d",&a)
    #define sc2(a,b) scanf("%d%d",&a,&b)
    #define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c)
    #define scs(a) scanf("%s",a)
    #define sclld(a) scanf("%I64d",&a)
    #define pt(a) printf("%d
    ",a)
    #define ptlld(a) printf("%I64d
    ",a)
    #define rep0(i,n) for(int i=0;i<n;i++)
    #define rep1(i,n) for(int i=1;i<=n;i++)
    #define rep_1(i,n) for(int i=n;i>=1;i--)
    #define rep_0(i,n) for(int i=n-1;i>=0;i--)
    #define Max(a,b) ((a)>(b)?(a):(b))
    #define Min(a,b) ((a)<(b)?(a):(b))
    #define lson (step<<1)
    #define rson (lson+1)
    #define esp 1e-6
    #define oo 0x3fffffff
    #define TEST cout<<"*************************"<<endl
    
    using namespace std;
    typedef long long ll;
    
    ll exgcd(ll a,ll b,ll &x,ll &y)
    {
        if(b==0)
        {
            x=1,y=0;
            return a;
        }
        ll ans=exgcd(b,a%b,x,y);
        ll temp=x;
        x=y;
        y=temp-a/b*y;
        return ans;
    }
    
    int main()
    {
        freopen("in.txt","r",stdin);
        int T_T;
        scanf("%d",&T_T);
        for(int kase=1;kase<=T_T;kase++)
        {
            ll a,mod;
            scanf("%lld%lld",&a,&mod);
            ll x,y;
            ll ans=exgcd(a,mod,x,y);
            if(1%ans)
                printf("Not Exist
    ");
            else
                printf("%lld
    ",(x%mod+mod)%mod+(mod==1));
        }
        return 0;
    }

    ZOJ 3593 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3593 求最小的步数,等价于求解方程:

    ax+by=gcd,(A-B)%gcd==0。

    又因为要求最小步数,所以,

    根据x = x0 + (b/gcd)*t,y = y0 – (a/gcd)*t

    我们可以推断当x==y时,步数是最小的,

    即y0-x0=t*(a+b)/gcd→t=(y0-x0) / ((a+b)/gcd),

    这样t的范围也就确定了。最后,如果x,y同号,取最大;如果异号,则做差

    /**************************************************************
        Problem:zoj 3593
        User: youmi
        Language: C++
        Result: Accepted
        Time:0ms
        Memory:272kb
    ****************************************************************/
    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    //#include<bits/stdc++.h>
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <map>
    #include <stack>
    #include <set>
    #include <sstream>
    #include <cmath>
    #include <queue>
    #include <deque>
    #include <string>
    #include <vector>
    #define zeros(a) memset(a,0,sizeof(a))
    #define ones(a) memset(a,-1,sizeof(a))
    #define sc(a) scanf("%d",&a)
    #define sc2(a,b) scanf("%d%d",&a,&b)
    #define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c)
    #define scs(a) scanf("%s",a)
    #define sclld(a) scanf("%I64d",&a)
    #define pt(a) printf("%d
    ",a)
    #define ptlld(a) printf("%I64d
    ",a)
    #define rep0(i,n) for(int i=0;i<n;i++)
    #define rep1(i,n) for(int i=1;i<=n;i++)
    #define rep_1(i,n) for(int i=n;i>=1;i--)
    #define rep_0(i,n) for(int i=n-1;i>=0;i--)
    #define Max(a,b) ((a)>(b)?(a):(b))
    #define Min(a,b) ((a)<(b)?(a):(b))
    #define lson (step<<1)
    #define rson (lson+1)
    #define esp 1e-6
    #define oo (1ll<<31)
    #define TEST cout<<"*************************"<<endl
    
    using namespace std;
    typedef long long ll;
    ll ex_gcd(ll a,ll b,ll &x,ll &y)
    {
        if(b==0)
        {
            x=1,y=0;
            return a;
        }
        ll gcd=ex_gcd(b,a%b,x,y);
        ll temp=x;
        x=y;
        y=temp-a/b*y;
        return gcd;
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        int T_T;
        scanf("%d",&T_T);
        for(int kase=1;kase<=T_T;kase++)
        {
            ll A,B,a,b;
            scanf("%lld%lld%lld%lld",&A,&B,&a,&b);
            ll x,y;
            ll len=B-A;
            ll gcd=ex_gcd(a,b,x,y);
            if(len%gcd==0)
            {
                a=a/gcd,b=b/gcd;
                x*=len/gcd,y*=len/gcd;
                ll m=(y-x)/(a+b);
                ll ans=1ll*oo*oo,temp;
                for(ll t=m-1;t<=m+1;t++)
                {
                    if(abs(x+b*t)+abs(y-a*t)==abs(x+b*t+y-a*t))
                        temp=Max(abs(x+b*t),abs(y-a*t));
                    else
                        temp=abs(x-y+(a+b)*t);
                    ans=Min(temp,ans);
                }
                printf("%lld
    ",ans);
            }
            else
                printf("-1
    ");
        }
        return 0;
    }

    POJ 1061 http://poj.org/problem?id=1061 青蛙的约会,由题意得:(mk+x)%L==(nk+y)%L,所以

    (m-n)k+L*t=gcd,(x-y)%gcd==0.。。。。。。。

    /**************************************************************
        Problem:poj 1061
        User: youmi
        Language: C++
        Result: Accepted
        Time:0ms  
        Memory:140kb
    ****************************************************************/
    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    //#include<bits/stdc++.h>
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <map>
    #include <stack>
    #include <set>
    #include <sstream>
    #include <cmath>
    #include <queue>
    #include <deque>
    #include <string>
    #include <vector>
    #define zeros(a) memset(a,0,sizeof(a))
    #define ones(a) memset(a,-1,sizeof(a))
    #define sc(a) scanf("%d",&a)
    #define sc2(a,b) scanf("%d%d",&a,&b)
    #define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c)
    #define scs(a) scanf("%s",a)
    #define sclld(a) scanf("%I64d",&a)
    #define pt(a) printf("%d
    ",a)
    #define ptlld(a) printf("%I64d
    ",a)
    #define rep0(i,n) for(int i=0;i<n;i++)
    #define rep1(i,n) for(int i=1;i<=n;i++)
    #define rep_1(i,n) for(int i=n;i>=1;i--)
    #define rep_0(i,n) for(int i=n-1;i>=0;i--)
    #define Max(a,b) ((a)>(b)?(a):(b))
    #define Min(a,b) ((a)<(b)?(a):(b))
    #define lson (step<<1)
    #define rson (lson+1)
    #define esp 1e-6
    #define oo 0x3fffffff
    #define TEST cout<<"*************************"<<endl
    
    using namespace std;
    typedef long long ll;
    ll ex_gcd(ll a,ll b,ll &x,ll &y)
    {
        if(b==0)
        {
            x=1,y=0;
            return a;
        }
        ll gcd=ex_gcd(b,a%b,x,y);
        ll temp=x;
        x=y;
        y=temp-a/b*y;
        return gcd;
    }
    
    int main()
    {
        //freopen("in.txt","r",stdin);
        ll A,B,a,b,l;
        while(~scanf("%lld%lld%lld%lld%lld",&A,&B,&a,&b,&l))
        {
            ll x,y;
            ll gcd=ex_gcd(a-b,l,x,y);
            ll len=B-A;
            if(len%gcd==0)
            {
                x*=len/gcd;
                l=abs(1.0*l/gcd);
                x%=l;
                if(x<=0)
                    x+=l;
                printf("%lld
    ",x);
            }
            else
                printf("Impossible
    ");
        }
        return 0;
    }

    HDU 1576 http://acm.hdu.edu.cn/showproblem.php?pid=1576 由题意可得:A=Bx,A=n+9973y;所以回归到我们的经典方程可得:

    Bx+9973y=gcd,n%gcd==0。。

    /**************************************************************
        Problem:hdu 1576
        User: youmi
        Language: C++
        Result: Accepted
        Time:0ms
        Memory:1548kb
    ****************************************************************/
    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    //#include<bits/stdc++.h>
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <map>
    #include <stack>
    #include <set>
    #include <sstream>
    #include <cmath>
    #include <queue>
    #include <deque>
    #include <string>
    #include <vector>
    #define zeros(a) memset(a,0,sizeof(a))
    #define ones(a) memset(a,-1,sizeof(a))
    #define sc(a) scanf("%d",&a)
    #define sc2(a,b) scanf("%d%d",&a,&b)
    #define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c)
    #define scs(a) scanf("%s",a)
    #define sclld(a) scanf("%I64d",&a)
    #define pt(a) printf("%d
    ",a)
    #define ptlld(a) printf("%I64d
    ",a)
    #define rep0(i,n) for(int i=0;i<n;i++)
    #define rep1(i,n) for(int i=1;i<=n;i++)
    #define rep_1(i,n) for(int i=n;i>=1;i--)
    #define rep_0(i,n) for(int i=n-1;i>=0;i--)
    #define Max(a,b) ((a)>(b)?(a):(b))
    #define Min(a,b) ((a)<(b)?(a):(b))
    #define lson (step<<1)
    #define rson (lson+1)
    #define esp 1e-6
    #define oo 0x3fffffff
    #define TEST cout<<"*************************"<<endl
    
    using namespace std;
    typedef long long ll;
    ll ex_gcd(ll a,ll b,ll &x,ll &y)
    {
        if(b==0)
        {
            x=1,y=0;
            return a;
        }
        ll gcd=ex_gcd(b,a%b,x,y);
        ll temp=x;
        x=y;
        y=temp-a/b*y;
        return gcd;
    }
    void cal(ll a,ll b,ll c)
    {
        ll x,y;
        ll gcd=ex_gcd(a,b,x,y);
        x*=c/gcd;
        b=abs(1.0*b/gcd);
        x%=b;
        if(x<=0)
            x+=b;
        ptlld(x);
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        int T_T;
        scanf("%d",&T_T);
        for(int kase=1;kase<=T_T;kase++)
        {
            ll n,b;
            scanf("%I64d%I64d",&n,&b);
            cal(b,9973,n);
        }
        return 0;
    }

    HDU 2669 http://acm.hdu.edu.cn/showproblem.php?pid=2669 这个是裸的欧几里得不为过,不过好好利用ax+by=1会使思路更加明晰

    /**************************************************************
        Problem:
        User: youmi
        Language: C++
        Result: Accepted
        Time:
        Memory:
    ****************************************************************/
    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    //#include<bits/stdc++.h>
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <map>
    #include <stack>
    #include <set>
    #include <sstream>
    #include <cmath>
    #include <queue>
    #include <deque>
    #include <string>
    #include <vector>
    #define zeros(a) memset(a,0,sizeof(a))
    #define ones(a) memset(a,-1,sizeof(a))
    #define sc(a) scanf("%d",&a)
    #define sc2(a,b) scanf("%d%d",&a,&b)
    #define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c)
    #define scs(a) scanf("%s",a)
    #define sclld(a) scanf("%I64d",&a)
    #define pt(a) printf("%d
    ",a)
    #define ptlld(a) printf("%I64d
    ",a)
    #define rep0(i,n) for(int i=0;i<n;i++)
    #define rep1(i,n) for(int i=1;i<=n;i++)
    #define rep_1(i,n) for(int i=n;i>=1;i--)
    #define rep_0(i,n) for(int i=n-1;i>=0;i--)
    #define Max(a,b) ((a)>(b)?(a):(b))
    #define Min(a,b) ((a)<(b)?(a):(b))
    #define lson (step<<1)
    #define rson (lson+1)
    #define esp 1e-6
    #define oo 0x3fffffff
    #define TEST cout<<"*************************"<<endl
    
    using namespace std;
    typedef long long ll;
    ll ex_gcd(ll a,ll b,ll &x,ll &y)
    {
        if(b==0)
        {
            x=1,y=0;
            return a;
        }
        ll gcd=ex_gcd(b,a%b,x,y);
        ll temp=x;
        x=y;
        y=temp-a/b*y;
        return gcd;
    }
    ll cal(ll a,ll b,ll c)
    {
        ll x,y;
        ll gcd=ex_gcd(a,b,x,y);
        if(c%gcd)
            return -1;
        x*=c/gcd;
        b=abs(1.0*b/gcd);
        x%=b;
        if(x<=0)
            x+=b;
        return x;
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        ll a,b;
        while(~scanf("%I64d%I64d",&a,&b))
        {
            ll ans=cal(a,b,1);
            if(ans==-1)
                printf("sorry
    ");
            else
                printf("%I64d %I64d
    ",ans,(1-ans*a)/b);
        }
        return 0;
    }

     poj 2115 http://poj.org/problem?id=2115 A+XC==B(MOD 2^K)

    /**************************************************************
        Problem:
        User: youmi
        Language: C++
        Result: Accepted
        Time:0MS
        Memory:712K
    ****************************************************************/
    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    //#include<bits/stdc++.h>
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <map>
    #include <stack>
    #include <set>
    #include <sstream>
    #include <cmath>
    #include <queue>
    #include <deque>
    #include <string>
    #include <vector>
    #define zeros(a) memset(a,0,sizeof(a))
    #define ones(a) memset(a,-1,sizeof(a))
    #define sc(a) scanf("%d",&a)
    #define sc2(a,b) scanf("%d%d",&a,&b)
    #define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c)
    #define scs(a) scanf("%s",a)
    #define sclld(a) scanf("%I64d",&a)
    #define pt(a) printf("%d
    ",a)
    #define ptlld(a) printf("%I64d
    ",a)
    #define rep0(i,n) for(int i=0;i<n;i++)
    #define rep1(i,n) for(int i=1;i<=n;i++)
    #define rep_1(i,n) for(int i=n;i>=1;i--)
    #define rep_0(i,n) for(int i=n-1;i>=0;i--)
    #define Max(a,b) ((a)>(b)?(a):(b))
    #define Min(a,b) ((a)<(b)?(a):(b))
    #define lson (step<<1)
    #define rson (lson+1)
    #define esp 1e-6
    #define oo 0x3fffffff
    #define TEST cout<<"*************************"<<endl
    
    using namespace std;
    typedef long long ll;
    ll ex_gcd(ll a,ll b,ll &x,ll &y)
    {
        if(b==0)
        {
            x=1,y=0;
            return a;
        }
        ll ans=ex_gcd(b,a%b,x,y);
        ll temp=x;
        x=y;
        y=temp-y*(a/b);
        return ans;
    }
    void solve(ll a,ll b,ll c)
    {
        ll x,y;
        ll d=ex_gcd(a,b,x,y);
        if(c%d!=0)
        {
            printf("FOREVER
    ");
            return ;
        }
        ll t=b/d;
        x=(x*(c/d)%t+t)%t;
        printf("%lld
    ",x);
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        ll a,b,c,k;
        while(~scanf("%lld%lld%lld%lld",&a,&b,&c,&k)&&(a+b+c+k))
        {
            solve(c,1ll<<k,b-a);
        }
        return 0;
    }
    @我 
    不为失败找借口,只为成功找方法
  • 相关阅读:
    1006 Sign In and Sign Out
    1005 Spell It Right
    1004 Counting Leaves
    1003 Emergency
    PAT甲级练习题1001、1002
    翻转字符串.
    JavaScript实现弹幕效果
    SSI技术
    c#事务处理(sqlTransaction)
    Fiddler查看接口响应时间
  • 原文地址:https://www.cnblogs.com/youmi/p/4770106.html
Copyright © 2011-2022 走看看