トピックへのリンク:https://cn.vjudge.net/problem/UVA-10791
タイトル効果:入力の整数nは、少なくとも2つの正の整数を見つけるようなそれらの少なくとも共通のnの倍数、及びこれらの整数と最小値、及び最小出力ています。
問題の意味の分析:我々は素因数分解に法律を使用し、そのような彼らの最小公倍数nは、少なくとも2つの正の整数を探します。N = P1 ^ T1 + P2 ^ T2 + .. PR ^ TR
我々が発見した場合の因子の最大数、およびこれらの要因の最小和(例:12 = 3 * 4 12> 4 + 3)
だから我々は、ちょうどこれらの素数の合計ができ、n個を打破する必要があります
1の#include <iostreamの> 2の#include <アルゴリズム> 3の#include <cmath> 4 使って 名前空間STD。 5 長い 長い(解決int型n)を 6 { 7つの 長い 長い ANS = 0 。 8 INT T = 0 。 9 INT H = SQRT(N + 1 )。 10 のint TEMP = 1 。 11 のために(int型 I = 2 ; iが= hを<Iは++ ) 12 { 13 IF(N-I%== 0 ) 14 { 15 T ++、TEMP = 1 ; 16 ながら(N-I%== 0 ) 17 { 18である N- / = I; 19。 TEMP * = I; // 注:ANS + =私;これは温度と同様に、2 * 3 * = iは、2 ^ 3である 20 } 21は ANS + = TEMP; 22である } 23である } 24 IF(N> 1)// SQRTよりも大きいあり(n)は素因数 25の ANS + N- =、T ++ ; 26は、 IF ==(T1)// Tは、素因数の数、請求項2の質問の数は、少なくとも表し 27 ANS + =を1。; 28 リターンANS; 29 } 30 のint main()の 31である { 32 // freopenは(「D:\\ in.txt "" R&LT "STDIN); 33である // freopenは(" D:「;、STDOUT)\\ out.txtを"" W 34である INT N-、T = 1 ; 35 ながら(〜scanfの(" %のD "、 &N-)) 36 { 37 [ IF N( - == 0 ) 38である BREAK ; 39 もし(N == 1 ) 40 のprintf(" ケース%D:2 \ n "、T ++ )。 41 他の 42 のprintf(" ケースは%d:%LLDの\ nを"、T ++ 、)N(解決)。 43 } 44 // FCLOSE(STDIN)。 45 // FCLOSE(STDOUT)。 46 }
注意事項:
1.なお、N = 1、2は、境界をテストする場合は、この必要性を考えて、答えです
2.両者の差の間の差が、乗数効果を再生するためにプラスである(8アナログを取ることができ、被検者の要件を満たしていません)
1 IF(N-I%== 0 ) 2 { 3。 T ++、TEMP = 1 ; 4。 一方、(N-I%== 0 ) 5。 { 6。 N- / = I; 7。 TEMP * = I; // 注:ANS + = I 2 * 3、これは温度と同様であり、* = I、3 ^ 2である 8。 } 9つの。 ANS + = TEMP; 10 }
1 IF(N-I%== 0 ) 2 { 3。 T ++、TEMP = 1 ; 4。 一方、(N-I%== 0 ) 5。 { 6。 N- / = I; 7つの。 ANS + = I; // 注:ANS + =私; * 3 2 * = iは、3 ^ 2であり、温度と同様に、これは、である 。8 } 9 }
書式#include <iostreamの> の#include <アルゴリズム> 書式#include <cmath> 使用して 名前空間はstdを、 長い 長い(解決int型N) { 長い 長のANS = 0 。 int型、T = 0 ; int型 H = SQRT(nは+ 1 )。 int型の温度= 1 ; 以下のために(int型 I = 2 ; iが= hを<I ++の) { 場合(N%I == 0 ) { T ++、TEMP = 1; 一方、(N-1%の== 0 ) { N- / = I; TEMP * = I; } ANS + = TEMP; } } IF(N> 1。 || T == 0)// SQRT(N)のより大きいあります素因数 ANS = N +、T ++ ; IF(T == 1)// Tは、素因数の数、少なくとも2必要な質問の数を表し ANS = +を1。; 戻りANSを; } int型(メイン) { // freopenは( "D:\\ in.txt"、 "R"、STDIN)。 // freopenは( "D:\\ out.txtを"、 "W"、STDOUT)。 int型、T =、nは1 ; 一方、(〜のscanf(" %d個"、&N)) { 場合(N == 0 ) ブレーク。 裁判所未満 << " ケース" <<トン++ << " :" <<(n)を解く<< てendl; } // FCLOSE(STDIN)。 // fcloseを(標準出力)。 }