扩展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); //返回最小解
} 


posted @ 2017-09-19 18:49  扩展的灰(Extended_Ash)  阅读(344)  评论(0编辑  收藏  举报