欧几里得
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
gcd和extgcd复杂度是相同的。O(log max(a,b));
形如a*x+b*y=c(a,b均不为0)的方程,a,b,c都是整数,求(x,y)的整数解。
1 判断是否有解
整数二元一次不定方程有解的充分必要是gcd(a,b)|c。如果不能整除则无解。
所以式子变为a*x+b*y=gcd(a,b);
#define ll long long
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if (b==0)
{
x=1,y=0;
return a;
}
ll gcd=exgcd(b,a%b,x,y);
ll tmp=x;
x=y;
y=tmp-a/b*y;
return gcd;
}
gcd是gcd(a,b)的值,(x,y)是求出来的一组特解,乘上c/gcd即可得到其原式特解;
int x,y,kx,ky;
int gcd=extgcd(a,b,x,y);
x*=c/gcd;
y*=c/gcd; //原式特解
kx=b/gcd;
ky=a/gcd;
//通解就是:x+kx*n,y-ky*n;
求最小正整数解:
x+kx*n,x最小为(x%kx+kx)%kx;
int x,y;
int gcd=extgcd(a,b,x,y);
x*=c/gcd;
kx=b/gcd;
if(k