扩展gcd算法
扩展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,a\mod b)\)
那么可以递归球解\(bx+(a\mod b)y=\gcd(a,b)\)的解。
然后还是要推当前\(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\)
核心代码: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\)。
博主是蒟蒻,有问题请指出,谢谢!
本博客中博文均为原创,未经博主允许请勿随意转载,谢谢。
本博客中博文均为原创,未经博主允许请勿随意转载,谢谢。