luogu1516 POJ1061 青蛙的约会

本文介绍了一种使用扩展欧几里德算法解决特定形式的同余方程的方法,并提供了详细的代码实现。通过该方法可以有效地找到方程的解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

研究同余方程。
先上代码。

#include <iostream>
#include <cstdio>
using namespace std;
long long k, s;
long long exgcd(long long a, long long b){
    if(b==0){
        k = 1;
        s = 0;
        return a;
    }
    long long re=exgcd(b, a%b);
    long long t=k;
    k = s;
    s = t - a / b * s;
    return re;
}
int main(){
    long long x, y, m, n, l, gcd;
    cin>>x>>y>>m>>n>>l;
    if(m-n<0){
        m ^= n, n ^=m, m ^= n;
        x ^= y, y ^=x, x ^= y;
    }
    if((y-x)%(gcd=exgcd(m-n, l))!=0)    printf("Impossible");   
    else    printf("%d", ((y-x)/gcd*k%(l/gcd)+(l/gcd))%(l/gcd));
    return 0;
}

要用long long。数据范围好康的!
来推导一下。其实就是  (y+nk)(x+mk)=sl ,变形易得  (mn)k+sl=yx ,即  (mn)kyx(modl) 。然后用扩展欧几里德即可。
注意,我们总是不希望gcd为负的,所以我们要调换一下当  mn<0 时。
引用一个做法:

若gcd(a, b) = d,则方程ax ≡ c (mod b)在[0, b/d - 1]上有唯一解。出处

因此应该模l/gcd。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值