- 欧几里得算法(求最大公因数)
Int gcd(int a,int b) return b==0? a:gcd(b,a%b);
- a*b=gcd(a,b)*lcm(a,b); 但是直接算a*b 可能会爆
正确写法是a/gcd(a,b)*b 先除后乘正确写法
- 拓展欧几里得算法 找出一对整数(x,y)使得ax+by=gcd(a,b);
代码:int exgcd(int a,int b,int &x,int &y)//扩展欧几里得算法
{
if(b==0)
{
x=1;y=0;
return a; //到达递归边界开始向上一层返回
}
int r=exgcd(b,a%b,x,y);
int temp=y; //把x y变成上一层的
y=x-(a/b)*y;
x=temp;
return r;//得到a b的最大公因数
}
推导ax+by=ay1+(a-(a/b))y1 整理得到 ax+by=ay1+b(x1-(a/b)y1) 故而有 x=y.,y=(a-(a/b))y1;
(因为a%b=a-a/b)
四可以用来解决的问题:求解在ax+by+c=0在某区间上的整点
只要-c是gcd(a,b)的倍数就有解然后再看能不能满足区间