1. 程式人生 > >擴充套件歐幾里得noip2012同餘方程

擴充套件歐幾里得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;
}