扩展欧几里得算法总结

解方程:ax+by=c即ax≡c (mod b

先上代码

#include
#define ll long long
ll exgcd(ll a,ll b,ll &x,ll &y)
{
	if(!b)
	{
		x=1;y=0;return a;
	}
	int gcd=exgcd(b,a%b,y,x);y-=x*(a/b);
	return gcd;	
}
int main()
{
	ll a,b,x,y,c;
	scanf("%lld %lld %lld %lld %lld",&a,&b,&x,&y,&c);
	ll gcd=exgcd(a,b,x,y);
	if(c%gcd)	printf("Impossible\n");
	else
	{
		x*=(c/gcd);//即这样子求出的是ax+by==gcd(a,b)的解,所以我们要两边同时*gcd 
		printf("%lld\n",x);
	}
	return 0;
}

通解:

x = x0 + (b/gcd)*t
y = y0 – (a/gcd)*t


最小解:

int len = abs ( b /gcd ) ; //防止b为负数
if( x0 % len < 0)	printf("%d\n",x0%len+len);
else printf("%d\n",x0%len);  //防止x0%len+len超出int范围


逆元:

即c==1,ax+by=1(gcd(a,b)==1)时

该方程的唯一解(方程在mod意义下解的个数为gcd(a,b),前提:有解即c%gcd(a,b)==0)

参考资料:

http://www.acmerblog.com/extend-gcd-5610.html

http://blog.csdn.net/zhjchengfeng5/article/details/7786595


你可能感兴趣的:(————数论———————,数论,扩展欧几里得,同余方程,逆元)