线性同余方程求最小非负整数解的模板(数论-扩展欧几里得算法)

已知一个方程: ax≡b(mod n),那么可以转化成关于x,y的方程: ax+ny=b。利用裴蜀定理和扩展欧几里得算法可以得到x的最小非负整数解。

模板:

此时calc里的a=原a,b=原n,c=原b。

LL exgcd(LL a,LL b,LL &x,LL &y)
{
	if(b==0)
	{
		x=1,y=0;
		return a;
	}
	LL xx,yy;
	LL g=exgcd(b,a%b,xx,yy);
	x=yy;y=xx-(a/b)*yy;
	return g;
}

LL calc(LL a,LL b,LL c)
{
	LL x,y;
	LL g=exgcd(a,b,x,y);
	if(c%g!=0) return -1 //无整数解
	x*=c/g;
	b=abs(b/g);
	return (x%b+b)%b;
}

猜你喜欢

转载自blog.csdn.net/wwwengine/article/details/81009613