参考:点击打开链接
描述:求关于 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;
}