扩展gcd算法
神tm ×度搜索exgcd 打到exg的时候出来ex咖喱棒。。。
球方程(ax+by=gcd(a,b))的一个解
如果(b=0),那么(gcd(a,b)=a),取(x=1,y=0)即可
否则:显然(gcd(a,b)=gcd(b,amod b))
那么可以递归球解(bx+(amod b)y=gcd(a,b))的解。
然后还是要推当前(x,y)的。
设(bx+(amod b)y=gcd(a,b))的解为(x_0,y_0),
(ax+by=gcd(a,b)=bx_0+(amod b)y_0)
(=bx_0+ay_0-blfloorfrac{a}{b}
floor y_0)
(=ay_0+b(x_0-lfloorfrac{a}{b}
floor y_0))
那么(x=y_0,y=x_0-lfloorfrac{a}{b} floor y_0)
核心代码:exgcd(a,b,&x,&y)
返回(gcd(a,b))
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)。