2013-team4/code/exgcd
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
{{{
用扩展欧几里德算法解不定方程ax+by=d.
g=gcd(a, b),如果d%g==0则方程有解,否则无解.
特解为(x0, y0),通解为(x, y)=(x0+t*b, y0-t*a)
需要保证a,b都是正整数
返回解满足x>=0且最小
}}}
{{{
LL exgcd(LL a, LL b, LL &x, LL &y)
{
if (b==0) { x=1; y=0; return a; }
LL g=exgcd(b, a%b, y, x);
y-=(a/b)*x;
return g;
}
bool solve(LL a, LL b, LL d)
{
LL x, y, g;
g=exgcd(a, b, x, y);
if (d%g) return false;
b/=g; a/=g; d/=g;
x=(x%b*(d%b)%b+b)%b;
y=(d-a*x)/b;
return true;
}
}}}
用扩展欧几里德算法解不定方程ax+by=d.
g=gcd(a, b),如果d%g==0则方程有解,否则无解.
特解为(x0, y0),通解为(x, y)=(x0+t*b, y0-t*a)
需要保证a,b都是正整数
返回解满足x>=0且最小
LL exgcd(LL a, LL b, LL &x, LL &y)
{
if (b==0) { x=1; y=0; return a; }
LL g=exgcd(b, a%b, y, x);
y-=(a/b)*x;
return g;
}
bool solve(LL a, LL b, LL d)
{
LL x, y, g;
g=exgcd(a, b, x, y);
if (d%g) return false;
b/=g; a/=g; d/=g;
x=(x%b*(d%b)%b+b)%b;
y=(d-a*x)/b;
return true;
}