欧几里得算法是用来计算两个数的最大公约数;
int GCD(int a, int b)//注意此处a>b;
{
return b==0?a:gcd(b, a%b);
}
应用:
一:最常见的,用来求最小公倍数(LCM);
LCM=a/GCD(a, b)*b;
二:扩展欧几里得算法, 求二元一次方程(a*x+b*y=c)的解;
二元一次方程性质:(a*x+b*y=c)有解(整数解)的充要条件:c|gcd(a, b)(c是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 t=x;
x=y;
y=t-a/b*y;
return r;
}
r表示a, b的最大公约数; x, y为c=gcd(a, b)时的一个解;
a/=r, b/=r;
x+=k*b, y-=k*a(k∈Z)是c=r的通解; d=gcd(a, b);
则a*x+b*y=c的特解:x*=d, y*=d;
a/=r, b/=r;
则通解:x+=k*b, y-=k*a(k∈Z)
【数论|欧几里得算法(辗转相除)&扩展欧几里得】
推荐阅读
- HDU 5528【2015长春现场赛 B】 Count a * b
- 类欧几里得算法|[类欧几里得算法 数论] BZOJ 2987 Earthquake
- [数论] Codeforces 819D R #421 D.Mister B and Astronomers & 516E R #292 E. Drazil and His Happy Friends
- 模板 poj2947 Widget Factory 高斯消元
- 【扩展欧几里得】练习题
- 扩展欧几里得【数论
- 数论|hdu 5322 Hope(分治+NTT)
- HDU 5528 Count a × b
- 线性同余方程组
- 数论|AtCoder Beginner Contest 156 C.Rally