2019年夏のトレーニングDAY16(problem2.b)(約)

効果の対象に

与えられたN、N-以下シーク回数に「除数番号」最大数(N <= 1E18)であります

通常、異なる除数の数、例:それぞれ約12数1234612、これらの番号122346番目の除数、約12からその数は約18数にあります。

そのため、nの広い範囲で、私たちは単純なアプローチを使用することはできません。

私たちは、この方法を考える:それは、できるだけ少ない数とこの数について、いくつかのより多くを求めているので、2 ^ 3 ^ 2 * 3 * 3と2 ^ 3 ^ 2がnの範囲内であれば、我々は2のため、前者は確かに優れている選びます前者の方が小さいながら数が数であるとして約分だけ、(2 + 1)*(1 + 3)です。

利用可能な品質指標係数は単調減少ではありません

注意してください!誤った概念があるかもしれません:より良い小さな品質係数の選挙以来、なぜ疲れて2からそれをすべて取りませんか?

我々は場合は、同じ番号が約数を有することを保証することがより好ましい場合と判断されたため、このような8と12、8 = 2 ^ 2 ^ 2 * 3,12 = 3、我々が選択した12のように明らかに優れ、より離れて選択します少数ではなく、盲目的に小さな選択に。(、前提条件にイデオロギー的な厳密さを注意してください)。

そして、「除数」を考えます

または説明:実施例12のために、2×2 ^ 3に分解することができる、2のその後品質指数ファクタは0,1,2、指標3個の素因数は0、二相の任意の組み合わせを選択するの数であってもよいとすることができますそれは、「数の数について」最後の乗っています

具体的な実現、私たちは疲れを取るために品質係数を見つけたので、使用品質係数が数十までの範囲であり、DFSを使用することができ、あなたは一つ一つ、そして我々はDFS統計を答えることができる最後の時間を列挙することができます

#include <ビット/ STDC ++ H>
 の#define N 10000003
 の#define LL長い長
 の#define INF21億
 使用 名前空間STDを、
LL)(読み取り
{ 
    LL X = 0、F = 1チャー S = GETCHAR()。
    一方、(S < ' 0 ' || S> ' 9 '){ もし、(S == ' - ')、F = - 1 ; S = GETCHAR();}
     一方、(S> = ' 0 ' && S <= ' 9'){X = X * 10 + S- ' 0 ' ; S = GETCHAR();}
     戻りのx *のF。
} 
LL N、TOT = 0 
LL ANS = INF。
LLプライム[] = { 2357111317192329313741434751535759616771737983 }。
ボイドDFS(NUM LL、LLのPOS、LL N、LLの合計)
{ 
    場合(和> n)のリターン;
    もし(NUM> TOT){ANS =和、TOT = NUM;}
     そうでない 場合(TOT == NUM && ANS>和)ANS = 和。
    以下のためにint型 i = 1 ; iは= < 100 ; ++ I)
    { 
        LLのRES = POW(プライム[POS]、I)。
        もし(合計> N / resを)ブレーク
        DFS(NUM *((I + 2)*(I + 1)/ 2)、POS + 1、nは、和* RES)。
    } 
} 
int型のmain()
{ 
//     freopenは( "b.in"、 "R"、STDIN)。
//     freopenは( "B.OUT"、 "W"、STDOUT)。
    N = 読み取ります(); 
    DFS(10、nは、1 )。
    printf(" %のLLDする\ n%LLD " 、ANS、TOT)。
} 
/ * 
* /
コードの表示

私が遊んでいたときは、(ANSとTOTで更新モードのDFSが最も小さいANSを保証することができるので)素数に最初からループ内にありませんでした当初から素数であれば、[保存変数はうまく続か。

この質問は、それはあまりにも明らかであることはできませんが、気持ちのアイデアは、すべての素因数を列挙するのは簡単、こののない考えは、存在しない場合は品質係数は、問題解決が重要なポイントである、単調な指標の導入は騙されていない、特に場合は、まだ非常に重要です。

おすすめ

転載: www.cnblogs.com/yyys-/p/11266412.html