UVA10892最小公倍数因数分解

質問の意味:

       正の整数nを入力して、統計の数は、<= B(A、B)= N LCMを満たします。出力、及び整数nは、数の条件を満足します。

アイデア:

最小公倍数を求めて因数分解アルゴリズムは、結論することが可能です。もし分解の数は、明らかにアイデア

1セットのn = LCM(a、b)は =(P1 ^ R1)*(P2 ^ R2)*(P3 ^ R3)...(午後^ RM)

と=(P1 ^ A1)*セット (P2 ^ A2)*(P3 ^ A3)...(午後^午前)、B =(P1 ^ B1)*(P2 ^ B2)*(P3 ^ B3)を...(午後^ BM)

LCMによってRI =最大{AI、BI}定義され

、それぞれが、RI、AIとBIは、少なくともRI取るために

取られたAI RIの場合には2を、ビ[0、RI-1を取ることができますケースり任意の整数; BI同様に採取RI RI種の場合。最後に、AIおよびBIは、一緒になって、RIの場合、(2つの* RI + 1)の場合の総取られる

ので、(B)、および(b、a)の繰り返し回数を考慮しているので、最終的に3、が、(N、Nを)ウェル回だけ場合、そうANS最後=(ANS + 1)/ 2 = ANS / + 1 2( ANSは奇数)であるため、

4最適化:範囲√N内のみ素数を考慮に

1の#include <iostreamの>
 2の#include <cstdioを>
 3の#include < 文字列・H>
 4の#include <cmath>
 5  使って 名前空間STD。
6  のconst  int型 MAXX = 100005 7  INT FAC [MAXX]。
8  のint NUM [MAXX]、プライム[MAXX]、P [MAXX]。
9  int型CNT、K。
10  ボイドisprime()
 11  {
 12      のmemset(プライム、はsizeof (プライム))。
13      K = 0 14      のためにint型 I = 2 iが++; iがMAXX < 15      {
 16          であれば(プライム[I])
 17          {
 18              P [K ++] = ;私
19              のためのint型 Jは= iは+ I、J <MAXX; J + = I)
 20                  プライム[I] = 21          }
 22      }
 23  }
 24  空隙ガオ(長い N)
 25  {
 26      、CNT = 0 27      isprime()。
28      のためにint型 I = 0、I <K; iは++ 29          であれば(N%のP [I] == 0 30          {
 31              のint A = 0 32              一方、(N%のP [I] == 0 33              {
 34                  N / A = P [i]は、
35                  ++ ;
36              }
 37              FAC [CNTは] = Pを[I]。
38              NUM [CNTは++] = 39          }
 40      であれば(N> 141      {
 42          FAC [CNT] = N。
43          NUM [CNT ++] = 1 44      }
 45  }
 46  のint main()の
 47  {
 48      長い N。
49      一方(CIN >> N)
 50      {
 51          であれば(N == 0 52              ブレーク53          ガオ(N)
54の         長い 長い ANS = 1 55          のためのint型 I = 0; iは、CNTを<; iは++ 56の              ANSを* = NUM [I] * 2 + 1 57          のANS =(ANS + 1)/ 2 58          coutの<< N << "  " << ANS << てendl;
59      }
 60      リターン 0 61 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/ljy08163268/p/11705079.html