1. 程式人生 > >擴充套件gcd以及同餘方程ax=b(mod M)

擴充套件gcd以及同餘方程ax=b(mod M)

關於擴充套件gcd其實沒有必要搞懂,背下來就好了如果不會的自行學習

對於方程ax=b(mod M),我們可以將其化簡成為ax+My=b,讓後用擴充套件gcd求解

當b|r=gcd(a,M)時,方程有r個解,否則無解,對於有解的情況,每個解為用gcd求出的x乘上b/r+k*(M/r)

int extgcd(int a,int b,int& x,int& y){
	if(b){
		int r=extgcd(b,a%b,y,x);
		y-=x*(a/b); return r;
	} else { x=1; y=0; return a; }
}
int solve(int a,int b,int M){
	int x,y,r=extgcd(A,M,x,y);
	if(B%r) return -1; else x=(x+M)%M*b/r;
	// return x; 這個是返回通解
	return x%(M/r); //返回最小解
}