zoukankan      html  css  js  c++  java
  • SRM遇到的一个数论技巧——最大公约数和最小公倍数的关系

    最大公约数L和最小公倍数G的关系:

    1、L%G == 0;

    2、设A, B的最大公约数为G, 最小公倍数为L,则:

    L/G = (A/G)*(B/G)

    3、gcd(A/G, B/G) = 1;

    题目:给出一对数A, B 的最大公约数G, 最小公倍数L。这里A, B有多种组合。,求A,B的一种组合使得A + B最小。如果没有则输出-1(SRM535 div2 500pt)

    (G <= 10^12, L<=10^12)

    猛的一看数据很大。不过用上前边的定理就可以解决了。

    领X  = L/G;

    枚举A/G的值(不超过sqrt(X)),得到B/G的值。判断是否满足定理3。在所有满足的情况中找最小的ans = min(ans, (A/G + B/G))。最后结果为ans*G

    代码:

     1 #include <vector>
    2 #include <list>
    3 #include <map>
    4 #include <set>
    5 #include <queue>
    6 #include <deque>
    7 #include <stack>
    8 #include <bitset>
    9 #include <algorithm>
    10 #include <functional>
    11 #include <numeric>
    12 #include <utility>
    13 #include <sstream>
    14 #include <iostream>
    15 #include <iomanip>
    16 #include <cstdio>
    17 #include <cmath>
    18 #include <cstdlib>
    19 #include <ctime>
    20
    21 using namespace std;
    22
    23
    24 class FoxAndGCDLCM {
    25 public:
    26 long long gcd(long long a, long long b) {
    27 if(b == 0) return a;
    28 return gcd(b, a%b);
    29 }
    30
    31 long long get(long long G, long long L) {
    32
    33 if(L%G) return -1;
    34 long long i, x = L/G;
    35 long long ans = L;
    36
    37 for(i = 1; i*i <= x; ++i) {
    38 if(x%i) continue;
    39 if(gcd(i, x/i) == 1) {
    40 ans = min(ans, i + x/i);
    41 }
    42 }
    43 return ans*G;
    44 }
    45 };
    46
    47
    48
    49 //Powered by KawigiEdit 2.1.8 (beta) modified by pivanof!



  • 相关阅读:
    3.2.1 webpack-dev-server的使用
    打印预览及打印
    2.1.8 webpack的环境
    常用docker 启动
    github镜像
    Log解析
    【Bzoj4555】【Luogu P4091】求和(NTT)
    【Bzoj3527】【Luogu3338】[Zjoi2014]力(FFT)
    FFT实现高精度乘法
    Bzoj 2190 仪仗队(莫比乌斯反演)
  • 原文地址:https://www.cnblogs.com/vongang/p/2418823.html
Copyright © 2011-2022 走看看