拓展欧几里得 专题

放肆的年华 提交于 2020-04-06 11:32:23

大神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\n",a)
#define ptlld(a) printf("%I64d\n",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\n");
        else
            printf("%lld\n",(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\n",a)
#define ptlld(a) printf("%I64d\n",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\n",ans);
        }
        else
            printf("-1\n");
    }
    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\n",a)
#define ptlld(a) printf("%I64d\n",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\n",x);
        }
        else
            printf("Impossible\n");
    }
    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\n",a)
#define ptlld(a) printf("%I64d\n",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\n",a)
#define ptlld(a) printf("%I64d\n",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\n");
        else
            printf("%I64d %I64d\n",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\n",a)
#define ptlld(a) printf("%I64d\n",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\n");
        return ;
    }
    ll t=b/d;
    x=(x*(c/d)%t+t)%t;
    printf("%lld\n",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;
}
@我 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!