简单的通过辗转相除法即可求得最大公约数,原两数乘积除以最大公约数,即是最小公倍数
对于大数的情况来说,一般需要进行求模取余:
typedef long long ll;
const ll mod = 1e9 + 7;
//取模
ll MOD(ll a, ll m) {
a %= m;
if (a < 0)a += m;
return a;
}
// 求逆元(除此之外,fast(a,m-2,m)也可)
ll inverse(ll a, ll m) {
a = MOD(a, m);
if (a <= 1)return a;
return MOD((1 - inverse(m, a) * m) / a, m);
}
// 求最大公约数
ll gcd(ll a, ll b) {
a = abs(a), b = abs(b);
while (b != 0) {
a %= b;
swap(a, b);
}
return a;
}
// 求最小公倍数
ll lcm(ll a, ll b) {
return a * b / gcd(a, b);
}
// 快速幂
ll fast(ll a, ll b, ll mod) {
a %= mod;
if (b < 0)a = inverse(a, mod), b = -b;
ll ans = 1;
while (b) {
if (b & 1)ans = ans * a % mod;
a = a * a % mod;
b /= 2;
}
return ans % mod;
}