【Luogu】P1516青蛙的约会(线性同余方程,扩展欧几里得)

题目链接

定理:对于方程\(ax+by=c\),等价于\(a*x=c(mod b)\),有整数解的充分必要条件是c是gcd(a,b)的整数倍。

      ——信息学奥赛之数学一本通

避免侵权。哈哈。

两只青蛙跳到一格才行,所以说

\(x+mt=y+nt(mod l) \)

\((x-y)+(m-n)t=0(mod l)\)

\((m-n)t+ls=(y-x)  s属于整数集\)

 令a=n-m,b=l,c=gcd(a,b),d=x-y

则有\( at+bs=d\)

扩展欧几里得求解。

设c=gcd(a,b),若d/c 不是整数则无解。

最小解=(c*(d/c)%b+b)%b

这里是扩展欧几里得的代码。

long long exgcd(long long a,long long b,long long &x,long long &y){
    if(b==0){
        y=0;x=1;
        return a;
    }
    long long ret=exgcd(b,a%b,x,y);
    long long tmp=x;x=y;y=tmp-a/b*y;
    return ret;
}
扩展欧几里得

附上解题代码

#include<iostream>
#include<cstdio>
using namespace std;

long long p,q;

long long exgcd(long long a,long long b,long long &x,long long &y){
    if(b==0){
        y=0;x=1;
        return a;
    }
    long long ret=exgcd(b,a%b,x,y);
    long long tmp=x;x=y;y=tmp-a/b*y;
    return ret;
}

int main(){
    long long n,m,x,y,l;
    cin>>x>>y>>m>>n>>l;
    long long a=x-y,b=n-m;
    if(b<0){
        b=-b;a=-a;
    }
    long long c;
    if((a)%(c=exgcd(b,l,p,q))){
        printf("Impossible");
        return 0;
    }
    printf("%lld",((a)/c*p%(l/c)+(l/c))%(l/c));
    return 0;
}

 

转载于:https://www.cnblogs.com/cellular-automaton/p/7481902.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值