最大公约数
参考资料
欧几里得算法
欧几里得算法(辗转相除法)可以求两个整数的 最大公约数(Greatest Common Divisor,GCD)。
- 递归
- 迭代
ll Gcd(ll a,ll b)
{
return !b?a:Gcd(b,a%b);
}
ll Gcd(ll a,ll b)
{
while(b)
{
ll t=a;
a=b;
b=t%b;
}
return a;
}
扩展欧几里得算法
扩展欧几里得算法(Extended Euclidean Algorithm,EXGCD)可以求 的一组整数解。
- 元组
- 引用
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};
}
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;
}
例题
给定不定方程 。()
- 若无整数解,输出
-1。 - 若有正整数解,输出正整数解的数量,在正整数解中 的最小值, 的最小值, 的最大值, 的最大值。
- 若没有正整数解,输出 的最小正整数值, 的最小正整数值。
求同余方程 的最小正整数解。()