• UVA11388 GCD LCM


    链接点这儿

    题目:

    The GCD of two positive integers is the largest integer that divides both the integers without any remainder. The LCM of two positive integers is the smallest positive integer that is divisible by both the integers. A positive integer can be the GCD of many pairs of numbers. Similarly, it can be the LCM of many pairs of numbers. In this problem, you will be given two positive integers. You have to output a pair of numbers whose GCD is the first number and LCM is the second number.

    Input The first line of input will consist of a positive integer T. T denotes the number of cases. Each of the next T lines will contain two positive integer, G and L. Output For each case of input, there will be one line of output. It will contain two positive integers a and b, a ≤ b, which has a GCD of G and LCM of L. In case there is more than one pair satisfying the condition, output the pair for which a is minimized. In case there is no such pair, output ‘-1’. Constraints • T ≤ 100 • Both G and L will be less than 231 .

    Sample Input 2 1 2 3 4

    Sample Output 1 2 -

    题目大意:

    其实就是说,给你两个数的GCD和LCM,让你求一种小的那个数尽可能的小,并大的在这个基础上也尽可能的小的那两个数。

    先上代码!

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int t;
     4 long long a,b,c,d,ans[101][3];
     5 int main()
     6 {
     7     cin>>t;
     8     for(int i=1;i<=t;i++)
     9     {
    10         cin>>a>>b;
    11         if(b%a==0)//如果GCD可被LCM整除 
    12         {
    13             ans[i][1]=a;
    14             ans[i][2]=b;
    15             continue;
    16         }
    17         else ans[i][1]=-1;
    18     }
    19     for(int i=1;i<=t;i++)
    20     if(ans[i][1]==-1)
    21     printf("-1
    ");
    22     else
    23     printf("%lld %lld
    ",ans[i][1],ans[i][2]);
    24     return 0;
    25 }

    为什么可以这么写呢?下面我详细讲一讲:

    证明:

    我们先看到第11行的if语句:当GCD可被LCM整除时,两个数为GCD和LCM。

    我们设两个数分别为a,b。(a<=b)

    首先我们知道,GCD一定可以被a和b整除,而a和b又可以被LCM整除,所以GCD一定可被LCM整除。

    而我们又知道,当一个数x可被y整除时,他们的GCD为x,LCM为y

    又因为GCD*k=a(k>=1&&k==int(k)),所以a>=GCD,最小值为GCD。

    所以我们这里就设a为最小值。(也就是a=GCD)

    我们确定了a以后,又根据公式:GCD*LCM=a*b,其中GCD,a,LCM已知,所以b的值一定是固定的,而且就等于LCM。

    所以当a取最小值(a=GCD(a,b),b=LCM(a,b))时,(a,b)为符合要求的最优解。

    证毕。

    第11行证完了之后,我们再来证第17行的else语句。

    其实还是利用GCD一定可以被a和b整除,而a和b又可以被LCM整除,所以GCD一定可被LCM整除这个原理。

    所以一定无解。

    证毕。

    这个时候我们就证完了。O(t)算法(其实可以算是O(1))。

    如果你觉得你有更巧妙的方法,欢迎在下方留言。

  • 相关阅读:
    JAVA-throw new IOException报错unhandled exception:java.lang.Exception 2021年6月7日
    GIt保持远程 源仓库与Fork仓库同步--2017年6月13日
    Python的getattr()-2017年6月7日
    JavaScript学习-2017年5月18日
    Writing your first Django app--2017年5月9日
    M4-AC6 Oh,Trojan Again--2017年5月9日
    吴军硅谷来信
    【1】Prologue--A Game of Thrones--2017年4月8日
    M4-PC9 Read 10,000 Books,Travel 10,000 Miles--2017年5月8日
    资源分配图RAG的化简
  • 原文地址:https://www.cnblogs.com/xinxiyuan/p/11332841.html
Copyright © 2020-2023  润新知