数论板子

二进制GCD

inline int GCD(int x,int y){
    int i,j;
    if(x==0)return y;
    if(y==0)return x;
    for(j=0;0==(x&1);++i) x>>=1;   
    for(j=0;0==(y&1);++j) y>>=1;   
    if(j<i) i=j;
    while(1){
        if(x<y) x^=y,y^=x,x^=y;     
        if(0==(x-=y)) return y<<i;
        while(0==(x&1))x>>=1;
    }

EXGCD

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

线性方程ax+by=c

bool Equation(int a,int b,int c,int &x,int &y){  ax+by=c
    int d=exgcd(a,b,x,y);
    if(c%d)return 0;
    x=c/d*x;
    y=c/d*y;
    return 1; 
}
上一篇:POJ - 1061 青蛙的约会 (扩展欧几里得找最小整数解)


下一篇:hdu 1576 A/B