1.欧几里得原理是辗转相除法,用来求最大公约数的;
int gcd(int x,int y)
{
return y==0?x:gcd(y,x%y);
}
2.拓展欧几里得原理,可以用来解二元一次方程:AX+BY=C;
模板 (返回值是gcd(a,b))
int x,y;//全局变量
ll exgcd(int a,int b)
{
int d, t;
if(b==0)
{
x=1;
y=0;
return a;
}else
{
d = exgcd(b, a % b);
t = x - a / b * y;
x = y;
y = t;
return d;
}
}
int ans=exgcd(int a,int b,int&x,int &y),如果C%ans!=0,方程无解,因为C=k1ansx+k2ansy=ans(k1x+k2*y) k1,k2,x,y都是整数,所以一定能整除,不然就无解
然后解的x1,y1是其中的一组解,x通解是x1+b*t/ans;t是次数,如果要求最小解,加上
while(x1>0) x1-=b/ans;
x1+=b/ans;