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\)是多少

  1. 很显然\(lcm(a, b, c) = lcm(lcm(a, b), c)\)然后问题就转化成了\(lcm(a, x)\)\(x\)
  2. 给出了\(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;
        }
    }
}
posted @ 2020-12-09 17:25  u_yan  阅读(692)  评论(0编辑  收藏  举报