扩展欧几里得

  算ax+by=gcd(a, b)

void exgcd( ll a, ll b, ll &d, ll &x, ll &y ){  
    if( !b ) {
        d = a, x = 1, y = 0;        
    }
    else {
        exgcd( b, a%b, d, y, x );
        y -= x*(a/b);
    }
}

  算ax+by=c的解

int exgcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    int r=exgcd(b,a%b,x,y);
    int t=x;
    x=y;
    y=t-a/b*y;
    return r;
}

bool linear_equation(int a,int b,int c,int &x,int &y)
{
    int d=exgcd(a,b,x,y);
    if(c%d)
        return false;
    int k=c/d;
    x*=k; y*=k;    //求得的只是其中一组解
    return true;
}
ll e_gcd(ll a,ll b,ll &x,ll &y)  {
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    ll ans=e_gcd(b,a%b,x,y);
    ll temp=x;
    x=y;
    y=temp-a/b*y;
    return ans;
}

     证明参考博客:http://blog.csdn.net/acmore_xiong/article/details/47694909

原文地址:https://www.cnblogs.com/gggyt/p/7795107.html