• GCD与LCM【数论】


    题目大意:
    给出两个数的GCDLCM,求这两个数的最小差值。
    Iuput

    6 36

    Output

    6

    思路:
    一道数论题。
    我们设这两个数分别为xyxyg=gcd(x,y)l=lcm(x,y),那么必然有

    l=xg×yg×g

    l=xygg2

    约分得
    l=xyg

    移项得
    lg=xy

    由于g必然是x的因数,所以可以设k=gx,则
    x=kg
    带入上式,得
    lg=kgy
    ,
    根据等式的性质,得
    lg=kglk

    那么只要枚举k,我们就可以求出正确答案了。


    代码:

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    long long g,l,x,y,z,ans;
    
    int main()
    {
        scanf("%d%d",&g,&l);
        for (long long i=1;1;i++)
        {
            if (g*i>l/i) return printf("%d\n",ans)&0;  //当a>b时,程序结束
            if (l%i) continue;  //l不能整除i(即上文所述k)
            x=g*i;
            y=l/i;  //求出两数的值
            z=__gcd(x,y);  
            if (z==g&&x*y==g*l) ans=l/i-i*g;  //判断是否成立
        }
    }
  • 相关阅读:
    Netty应用
    原生JDK网络编程- NIO之Reactor模式
    Kafka入门教程
    Java CAS
    Java读写锁
    遍历map的四种方法
    java selector
    Range Sum Query
    Increasing Triplet Subsequence
    Count Numbers with Unique Digits
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/9313038.html
Copyright © 2020-2023  润新知