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
";
} 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;
}
}
}