zoukankan      html  css  js  c++  java
  • 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
    ";
            } 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;
            }
        }
    }
    
  • 相关阅读:
    aiohttp简介及快速使用
    Git的学习与使用
    基于scrapy-redis的分布式爬虫
    异步编程之asyncio简单介绍
    Scrapy框架中的CrawlSpider
    scrapy中selenium的应用
    ua池和代理池
    Scrapy持久化存储
    Scrapy的日志等级和请求传参
    virtualenv搭建Python虚拟环境
  • 原文地址:https://www.cnblogs.com/Xiao-yan/p/14109852.html
Copyright © 2011-2022 走看看