lcm理解
LCM
最小公倍数,求得方式为
\[(a*b)/gcd(a, b)
\]
从本质上看,是由\(a\)的全部质因子最高位和\(b\)的全部质因子并起来的结果
\(a = p _{a}^{k1} p _{b}^{k2} p _{c}^{k3}\)
\(b = p _{a}^{k4} p _{b}^{k5} p _{d}^{k6}\)
\(lcm(a, b) = p _{a}^{max(k1, k4)}p _{b}^{max(k2, k5)} p _{c}^{k3}p _{d}^{k6}\)
这个本质可以用到下题
Finding LCM LightOJ - 1215
这是VJ链接
题意是给出\(a\), \(b\), \(lcm(a, b, c)\)求最小的\(c\)是多少
- 很显然\(lcm(a, b, c) = lcm(lcm(a, b), c)\)然后问题就转化成了\(lcm(a, x)\)求\(x\)
- 给出了\(LCM\),并且\(LCM\)一定都是由\(a\)和\(x\)的全部质因子的最高次幂组成的,所以一定是可以从\(a\)下手,找到\(a\)中所有质因子,看看\(a\)中质因子的最高次幂是否可以充当\(LCM\)中的最高次幂,如果可以,那么就可以用这个质因子的最高次幂来充当\(LCM\),呐如果\(LCM\)中对于此质因子有更高次幂,只能用另一个数来进行充当了,即我们所求的数,如果我们想让我们所求的数最小,那就只让我们要求的这个数获得他必须获得的\(LCM\)中质因子最高次幂,而\(LCM\)中其他的质因子都可以由另一个已知的数凑成,那么就没必要用这个数来凑了。
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return (b?gcd(b, a%b):a);}
ll Lcm(ll a, ll b) {return a * b / (__gcd(a, b));}
int main()
{
ll a, b, L;
int cas = 0;
int t;
cin >> t;
while (t--) {
cin >> a >> b >> L;
a = Lcm(a, b);
cout << "Case " << ++cas << ": ";
if (L % a != 0) {
cout << "impossible\n";
} else {
ll ans = 1;
for (int i = 2; i <= a; i++) {
ll x = 1;
while (a % i == 0){
a /= i;
x *= i;
}
if (L/x%i==0) {
ans *= x;
}
L/=x;
}
ans *= L;
cout << ans << endl;
}
}
}