擴展歐幾里得noip2012同餘方程

參考:點擊打開鏈接


描述:求關於 x 的同餘方程 ax ≡ 1 (mod b)的最小正整數解。


對於貝祖等式 ax+by=gcd(a,b):

首先我們知道:輾轉相除法  gcd(a,b)=gcd(b,a%b)

又貝祖等式:  ax+by=gcd(a,b)必定有解

同時有: bx+(a%b)y=gcd(b,a%b)   =gcd(a,b)


所以:

       設 ax1+by1=gcd(a,b);

bx2+(a mod b)y2=gcd(b,a mod b);

根據樸素的歐幾里德原理有 gcd(a,b)=gcd(b,a mod b);

則:ax1+by1=bx2+(a mod b)y2;

即:ax1+by1=bx2+(a-(a/b)*b)y2=ay2+bx2-(a/b)*by2;

根據恆等定理得:x1=y2; y1=x2-(a/b)*y2;


另外此時求出的x,y是對於ax+by=gcd(a,b)下的解,不一定是最小正整數解,於是有x=(x%b+b)%b;

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章