質問の意味:
正の整数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> 1) 41 { 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 }