欧几里得

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;

猜你喜欢

转载自www.cnblogs.com/wzl19981116/p/9358840.html