GCD()和LCM()的关系:
GCD(a,b):就是求a,b的最大公约数。
LCM(a,b):就是求a,b的最小公倍数。
之后有一个公式:
a*b=GCD(a,b)*LCM(a,b)。
一般求GCD(a,b),用辗转相除法,代码很简洁。
int GCD(int x,int y){
if(!y) return x;
GCD(y,x%y);
}
int GCD(int a,int b){
return (b==0)?a:GCD(b,a%b);
}
//两种写法都行。
所以:LCM(a,b)=a*b/GCD(a,b)
(注意,这样写法有可能会错,因为a * b可能因为太大 超出int 或者 超出 longlong)
所以推荐写成 : lcm = a / gcd * b
相关公式:
GCD(ka, kb) = k * GCD(a, b)
LCM(ka, kb) = k * LCM(a, b)
LCM(S/a, S/b) = S/GCD(a, b) (处理分数时,可以使用这个公式)