gcd 是表示两个数的最大公约数
int gcd(int a, int b){ return b==0?a:gcd(b, a%b); }
在这里 , gcd(a, b) 是等于 gcd(b, a%b) , 证明如下 :
令 a = kb + p , gcd(a, b) = c , 那么就是 a, b 都可以整除 c , 那么 kb 也可以整除 c ,那么 a - kb 也可以整除 c , 所以 b 和 a%b 都可以整除 c
lcm 是表示两个数的最小公倍数 , 那么两个数的最小公倍数就等于两数之积除以两个数的最小公倍数
证明如下 :
设两个数 a = k1 * gcd, b = k2*gcd, 设 a , b 两个数的最小公倍数是 lcm , 那么lcm = t1 * a, lcm = t2 * b , 那么就有 t1*a = t2*b, 即 t1*k1*gcd = t2*k2*gcd , 因为t1 与 t2 互质, k1 与 k2互质,所以 t1 = k2, t2 = k1, 那么 lcm = k1*k2*gcd , 即 lcm = a*b/gcd;