poj-青蛙的约会(扩展欧几里得)&&nyoj-小柯的约会

由题意可列出方程

x + m * s - (y + n * s) = k * l;

化简得   (n-m)*s + k*l = x - y

化简得   (n-m)*s = x - y (mod l);

求解一次线性方程组(百度百科);

满足此等式的条件 (x-y)% gcd(n-m,l) == 0

然后运用扩展欧几里得求出s ;

poj 

#include<cstdio>
#include<cstring>
#include<cstdlib>
__int64 s,t,temp;
__int64 GCD(__int64 a,__int64 b)
{
    if(b==0) return a;
    return GCD(b,a%b);
}
void exgcd(__int64 a,__int64 b)
{
    if(b==0)
    {
        s=1;t=0;return;
    }
    else
    {
        exgcd(b,a%b);
        __int64 temp=s;
        s=t;t=temp-(a/b)*t;
    }
}
int main()
{
    __int64 x,y,m,n,l,a,b,r,c;
    while(scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&l)!=EOF)
    {
        a=n-m;b=l;c=x-y;
        r=GCD(a,b);
        if(c%r) {printf("Impossible\n");continue;}
        a=a/r;b=b/r;c/=r;
        exgcd(a,b);
        s=((c*s)%b+b)%b;//c*s为ax+bx=1的一个特解
        printf("%I64d\n",s);
    }
}

nyoj 有几组变态的数据 要考虑n-m < 0&& x-y<0的情况

#include<cstdio>
#include<cstring>
#include<cstdlib>
typedef long long LL;
LL s,t,temp;
LL GCD(LL a,LL b)
{
    if(b==0) return a;
    return GCD(b,a%b);
}
void exgcd(LL a,LL b)
{
    if(b==0)
    {
        s=1;t=0;return;
    }
    exgcd(b,a%b);
    LL temp=s;
    s=t;t=temp-(a/b)*t;
}
int main()
{
//    freopen("input.txt","r",stdin);
    LL x,y,m,n,l,a,b,r,c;
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);
        a=((n-m)%l+l)%l;b=l;
        c=((x-y)%l+l)%l;
        r=GCD(a,b);
        if(c%r) {printf("Impossible\n");continue;}
        a=a/r;b=b/r;c/=r;
        exgcd(a,b);
        s=((c*s)%b+b)%b;
        printf("%lld\n",s);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值