数学#扩展欧几里德 POJ 1061&2115&2891

Posted ATM

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数学#扩展欧几里德 POJ 1061&2115&2891相关的知识,希望对你有一定的参考价值。

寒假做的题了,先贴那时写的代码。

 

POJ 1061

#include<iostream>
#include<cstdio>
typedef long long LL;
using namespace std;

void extend_gcd(LL a,LL b,LL &d,LL &x,LL &y)
{
    if(b==0)
    {
        d=a;
        x=1,y=0;
    }
    else
    {
        extend_gcd(b,a%b,d,y,x);
        y-=x*(a/b);
    }
}

int main()
{
    LL x,y,m,n,L;
    while(scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&L)!=EOF)
    {
        LL d,xx,yy;
        extend_gcd(n-m,L,d,xx,yy);
        if((x-y)%d==0)
        {
            LL p=L/d;
            xx=(x-y)/d*xx;
            xx=(xx%p+p)%p;
            printf("%I64d\n",xx);
        }
        else printf("Impossible\n");
    }
    return 0;
}

POJ 2115

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdlib>
#include<vector>
#include<stack>
#include<map>
using namespace std;
typedef long long ll;

ll extend_gcd(ll a,ll b,ll &x,ll &y)
{  //return d=gcd(a,n);
    if(b==0)
    {
        x=1,y=0;
        return a;
    }
    else
    {
        ll t=extend_gcd(b,a%b,x,y);
        ll xx=x,yy=y;
        x=yy;
        y=xx-(a/b)*yy;
        return t;
    }
}

int main()
{
    ll A,B,C,k,x,y;
    while(~scanf("%I64d %I64d %I64d %I64d",&A,&B,&C,&k))
    {
        if(A==0&&B==0&&C==0&&k==0)  break;
        ll a=C,b=B-A,n=(ll)1<<k; //n=2^k
        ll d=extend_gcd(a,n,x,y);

        if(b%d!=0) //方程无解
            printf("FOREVER\n");
        else
        {
            x=(x*(b/d))%n;  //x为方程ax=b(mod n)的最小解
            x=(x%(n/d)+n/d)%(n/d);  //x为方程ax=b(mod n)的最小整数解
            printf("%I64d\n",x);
        }
    }
    return 0;
}

POJ 2891

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;

void extend_gcd(ll a,ll b,ll &d,ll &x,ll &y)
{
    if(b==0)
    {
        d=a;
        x=1,y=0;
    }
    else
    {
        extend_gcd(b,a%b,d,y,x);
        y-=x*(a/b);
    }
}

int main()
{
    int k;
    ll a1,r1,a,r;
    while(~scanf("%d",&k))
    {
        scanf("%I64d%I64d",&a1,&r1);
        int flag=1;
        for(int i=2;i<=k;i++)
        {
            scanf("%I64d%I64d",&a,&r);
            ll d,x,y;
            extend_gcd(a1,a,d,x,y);
            if((r-r1)%d!=0)
                flag=0;
            ll p=a/d;
            x=(r-r1)/d*x;
            x=(x%p+p)%p;
            r1=a1*x+r1;
            a1=a1*(a/d);
        }
        if(flag)
            printf("%I64d\n",r1);
        else printf("-1\n");
    }
    return 0;
}

以上是关于数学#扩展欧几里德 POJ 1061&2115&2891的主要内容,如果未能解决你的问题,请参考以下文章

扩展欧几里德 poj1061 青蛙的约会

POJ1061-青蛙的约会---扩展欧几里德算法求最小整数解

poj 1061 青蛙的约会 (扩展欧几里得模板)

POJ 1061 青蛙的约会(扩展欧几里德)

POJ 1061 青蛙的约会 扩展欧几里得

POJ 1061 青蛙的约会 (扩展欧几里德)