Skip to main content

最大公约数

参考资料

欧几里得算法

欧几里得算法(辗转相除法)可以求两个整数的 最大公约数(Greatest Common Divisor,GCD)。

gcd(a,b)=gcd(b,amodb)\gcd(a,b)=\gcd(b,a\bmod b)
46 Bcpp
ll Gcd(ll a,ll b)
{
return !b?a:Gcd(b,a%b);
}

扩展欧几里得算法

扩展欧几里得算法(Extended Euclidean Algorithm,EXGCD)可以求 ax+by=gcd(a,b)ax+by=\gcd(a,b) 的一组整数解。

ax+by=gcd(a,b)ax+by=\gcd(a,b)
110 Bcpp
tuple<ll,ll,ll> exgcd(ll a,ll b)
{
if(!b)return {a,1,0};
auto [g,x,y]=exgcd(b,a%b);
return {g,y,x-a/b*y};
}

例题

给定不定方程 ax+by=cax+by=c。(a,b,c109a,b,c\le 10^9

  • 若无整数解,输出 -1
  • 若有正整数解,输出正整数解的数量,在正整数解中 xx 的最小值,yy 的最小值,xx 的最大值,yy 的最大值。
  • 若没有正整数解,输出 xx 的最小正整数值,yy 的最小正整数值。

求同余方程 ax1(modb)ax\equiv1\pmod b 的最小正整数解。(a,b2×109a,b\le2\times10^9