擴充套件歐幾里得noip2012同餘方程
阿新 • • 發佈:2019-02-05
描述:求關於 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; }