#554ラウンドCodeforces(DIV 2)C.猫が行う数学(数论GCD(a、b)はGCDを=(BA))

ポータル

問題の意味

  2つの正の整数、Bを考えます。

  Kを解くようにLCM(A + K、B + k)の最小値、例えばLCM()最小ことKが複数ある場合は、kの最小出力。

•アイデア

長い時間が経過した後、再びこの問題を行います

案の定、一つは新しい熟考を知ることができます❤

注意事項

GCD(B)= GCD(BA)= GCD(B、BA)(B> A)

証明:

提供GCD(A、B)= C

%のC = 0、Bの%のC = 0、(BA)%C = 0であります

したがってGCD(BA)= C

得GCD(A、B)= GCD(BA)

考えました:

GCD(A + K、BA)がなければならない(BA)因子

したがって、GCDは、(A + K、B + K)(BA)因子であるので、我々は、因子(iはいう因子)(BA)を列挙する

(A + k)のiがの倍数であるように

次に、kの溶液、及び最小LCMを満たしているか否かを判断します

のみ列挙I(A + k)と(B + K)の約数は必ずしも最大公約数GCDはないことに注意してください

除数得公倍数公倍数= * bの双方/除数

それは、両方の最大公約数の公倍数である場合には最小限に抑える必要があり、

ここでは、共通の分母であるかどうか差別はありませんが、単純に大会の数を取得し、その後、公倍数で取得します

最小の最小公倍数のすべての公倍数で

これは、最小公倍数の溶液への答えには影響を与えません。

例えば:

12 30

図12は、30であり、
A + K = 13 B +であるK = 31は除数であるI = 1つの公倍数= 403 K = 1
A + K = 18 B + K = 36除数I = 18の公倍数= 36、K = 6であり、
A + K = 14 B + K = 32除数I = 2公倍数= 224 K = 2
A + K = 18 B + Kが= 36の除数であるI = 9つの公倍数= 72、K = 6
A + K = 15 B + K = 33れる除数I = K 3の公倍数= 165 3 =
A + B + 18は、K = 36 Kである= I = 6つのウェル除数の倍数= 108、K = 6

条約の36最小数の場合、K = 6

•コード

1  // の#include <ビット/ STDC ++ H>
 2  // 使用して名前空間std。
3  // の#defineっ長い長い
 4  // の#define INF 0x3f3f3f3f
 5  // LL ANS = INF。
6  // LL、B。
7  // LLのLCM;
8  // 
9  // LL __lcm(LLのX、LLのY)
 10  // {
 11  //     リターンのx * yを/ __ GCD(X、Y)
12  // }
 13  // 
14  // 
15  // 空隙Slove(int型F)
 16  // {
 17 //     INT X = A / Fの+(%がF = 0!)。
18  //     INT Y =(BA)/ F。
19  //     IF(__ GCD(X、Y)== 1)
 20  //     {
 21  //         IF(__ LCM(x *はF、Y * F)<LCM)
 22  //         {
 23  //             LCM = __ LCM(X * F、Yの*のF)。
24  //             ANS = X * FA;
25  //         }
 26  //         IF(__ LCM(図示X * fとのY *のF)== LCM)
 27  //             ANS =分(ANSはX * FA)。
28  //     }
 29  //     他の
 30  //     {
31  //         IF(__ LCM((X + 1)* F、Y * F)<LCM)
 32  //         {
 33  //             LCM = __ LCM((X + 1)* F、Y * F)。
34  //             ANS =(X + 1)* FA。
35  //         }
 36  //         (__ LCM((X + 1)* F、Y * F)== LCM)であれば
 37  //             ANS =分(ANS、(X + 1)* FA)。
38  //     }
 39  // }
 40  // 
41  // のint main()の
 42  // {
 43  //     CIN >> A >> B。
44  //     (B <A)であれば
 45  //        スワップ(A、B)。
46  //     LCM = A * B / __ GCD(a、b)は、
47  // 
48  //     IF(== b)は
 49  //         ANS = 0。
50  //     他の
 51  //     {
 52  //         のための(LL i = 1; iは= BAを<*; iは++)
 53  //         {
 54  //             IF((BA)%をI == 0)
 55  //             {
 56  //                 Slove(I);
57  //                 Slove((BA)/ I);
58  //             }
 59  //         }
60  //     }
 61  //     COUT << ANS << ENDL。
62  // } 
63  
64  
65の#include <ビット/ STDC ++ H>
 66  使用 名前空間STDを、
67  の#defineっ長い長い
 68  LLのA、B;
69 LL ANS、LCM = 0x3f3f3f3f3f3f3f3f 70  のint main()の
 71  {
 72      CIN >> A >> B。
73      のLL D = ABS(A- B)。
74      のために(LL i = 1 ; iは= Dを<*; iは++ 75      {
 76         IF(Dは、%I == 0// Iの因子BA列挙
77          {
 78              ; LL%IA = K I //は+ Kの倍数を構成するために、私はニーズ
79              LL T =(K + A)*( B + K)/ I; // *のB / Iは、共通の複数持っ
80を             IF(T < LCM)
 81              {
 82                  LCM = T;
 83                  ANS = K;
 84              }
 85  
86              LL II = D / I、
 87              K = II %の-a II;
 88              T =(K + A)*(B + K)/ II、
 89              IF(T < LCM)
 90              {
 91                  = LCM T。
92の                  ANS = K。
93              }
 94          }
 95      }
 96      COUT << ANS << ENDL。
97 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/MMMinoz/p/11240607.html