擴展gcd算法

擴展gcd算法


神tm ×度搜索exgcd 打到exg的時候出來ex咖喱棒。。。算法

球方程\(ax+by=\gcd(a,b)\)的一個解spa

若是\(b=0\),那麼\(\gcd(a,b)=a\),取\(x=1,y=0\)便可code

不然:顯然\(\gcd(a,b)=\gcd(b,a\mod b)\)遞歸

那麼能夠遞歸球解\(bx+(a\mod b)y=\gcd(a,b)\)的解。class

而後仍是要推當前\(x,y\)的。擴展

\(bx+(a\mod b)y=\gcd(a,b)\)的解爲\(x_0,y_0\)
\(ax+by=\gcd(a,b)=bx_0+(a\mod b)y_0\)
\(=bx_0+ay_0-b\lfloor\frac{a}{b}\rfloor y_0\)
\(=ay_0+b(x_0-\lfloor\frac{a}{b}\rfloor y_0)\)搜索

那麼\(x=y_0,y=x_0-\lfloor\frac{a}{b}\rfloor y_0\)gc

核心代碼:exgcd(a,b,&x,&y)返回\(\gcd(a,b)\)di

il ll exgcd(ll a,ll b,ll&x,ll&y){
    ll ret;
    if(b==0)x=1,y=0,ret=a;
    else{
        ret=exgcd(b,a%b,x,y);
        ll x0=x,y0=y;
        x=y0,y=x0-a/b*y0;
    }
    return ret;
}

一點點擴展:球\(ax+by=c\)的整數解。時間

首先求解\(ax+by=\gcd(a,b)\),而後若是\(c\)\(\gcd(a,b)\)的倍數就有解(等式兩邊同時乘便可)不然無解(顯然)


例題:poj1061 蛤蛤青蛙的約會

設這兩隻蛤蛤跳\(t\)單位時間後跳到一塊兒,相差\(p\)圈。列方程:

\[(X+tN)-(Y+tM)=Lp\]

化簡:

\[(N-M)t+Lp=X-Y\]

而後就轉化成了球解\(ax+by=c\)

相關文章
相關標籤/搜索