同余方程(扩展欧几里得)

Posted wspl98765

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同余方程(扩展欧几里得)相关的知识,希望对你有一定的参考价值。

#include<cstdio>
using namespace std;
int x,y;
int gcd(int a,int b,int &x,int &y){
    if(!b){
        x=1,y=0;
        return a;
    }
    int ret=gcd(b,a%b,x,y);
    int t=x;
    x=y;
    y=t-a/b*y;
    return ret;
} 
int a,b;
int main(){
    scanf("%d%d",&a,&b);
    gcd(a,b,x,y);
    printf("%d",(x+b)%b);
    
    
}

欧几里得gcd(a,b)=gcd(b,a%b)=......

因为ax≡1(mod b) -》ax%b=1%b=1

所以ax+by=1,因为y是整数所以加个by就相当于%b(因为%b的本质是+上y个b),所以两个式子等价

由扩展欧几里得得 ax+by=gcd(a,b)=gcd(b,a%b)=bx+(a%b=a-a/b*b)*y=....(x,0)=x。(x是最大公约数,/是整除)

最后bx=b,(a%b)*y=0

所以得 x=1,y=0

因此递归就行了

x2=y1,y2=x1-a/b*y1(原x-整除的数*a/b=模数)

最后得到的是无数解中的一种,有可能是负的,只需要加上模数就行了

以上是关于同余方程(扩展欧几里得)的主要内容,如果未能解决你的问题,请参考以下文章

同余方程(扩展欧几里得)

『线性同余方程和中国剩余定理』

扩展欧几里得模板(洛谷1082 同余方程NOIP 2012 提高组 第二天 第一题)

POJ 2115 C Looooops (扩展欧几里德 + 线性同余方程)

洛谷 P1082 同余方程

luogu P1516 青蛙的约会(线性同余方程扩展欧几里德)