OwenOwlのテストD1T2ボーリング

## $説明$:

 

Weinai連れ去らガラス嘉百台のコンピュータ、退屈嘉百ガラスがベッドのカウントにある必要がありました。

嘉百人のガラス思考:数の数について多くがありますが、程度のカウント数について多くがあることを、これらの除数除数の多くは、多くがあります。

嘉百枚のガラスは考えた:それについてどのように多くの番号**の約12数があるのですか?数、約12から約18数を有する数約12〜約番号1、2、3、4、6、12、それぞれ、これらの番号1、2、2、3、4、6があります。

嘉百枚のガラスが希望:1〜$ N $、それのほとんどを数について数えた数に関する年数を?
嘉(彼女はオンラインゲームをプレイするコンピュータを持っているが)数百枚のガラスコンピュータが出てこないでしたので、彼女はあなたの助けを求めました。

## $入力$:


整数$ n $という。
## $の出力$:


総出力2つの系統。

最小出力が複数ある場合、最初の行は、数に関するカウント数に関する最大の正の整数を表します。

第二行は約約からのこの数を数えるの正の整数を表します。
## $サンプル$ $ Iの$:


### $入力$:


15
### $の出力$:


12

18
## $ $ $ II $サンプル:


### $入力$:


114514
### $の出力$:


110880

3402
## $制約$:


|テストポイント|範囲|
|:----------:|:----------:|
| $の$ 1 | N- $ <= $ 10件|。
| $ 2 $ | $ N- <= 10 ^ 3 $ |。
| $ 3 $ | $ N - <= 10 ^ 5 $ |。
| $ 4 $ | $ N - <= 10 ^ 7 $ |。
| $ 5 $ |。$ N - <= 10 ^ 9 $ |
| $ 6,7であります$ | N- $ <= ^ {10} $ 13は|
| $ 8,9、10 $ | N- $ <= ^ {10} $ 18があります|

## $ソリューション$:


私が見たこんにゃく問題が試験中に存在する、離れて何か他のものから直接観測されたデータポイントは、テーブルを再生するために使用することができ、少なくとも最初の4つのポイントを超える見つけ、最初のアプローチは、一般的に前$ 1 $である - $ 10 ^ 7 $各数(1と自分自身を追加するために注意を払うように、その将来の数についてのカウント数を更新するために、現在の列挙の倍数)の約数の数。

そして、その約数の約数を更新するために、同様の原理を使用しています。複雑です

の$ O(n個の*(1 + 1/2 + 1/3 + ... + 1 / n))が\約O(nlog_n)$

$ 10 ^ 7 $表を打つか、すぐに~~実際には、また、特に私は~~ lwqギャングスターを見つけることができない、70ポイントを横にすることができます。

下面是部分分解:
`` `
//打表
の#include <ビット/ STDC ++ H>
名前空間STDを使用して、
長い長いF [10000001]、DP [10000001]。
INTメイン()
{
freopenは( "2.txt"、 "W"、STDOUT)。
INT、N = 10000000; [1] 1 = F。
以下のために(; iは= N <; I = 2のとき、INTレジスタ++ I){
F [I] + = 2;
用(INT J = 2レジスタ; iは= N <jは*; ++ j)は
F [J * I]を++。
}
DP [1] = 1。
以下のために(; iは= N <; I = 2のとき、INTレジスタ++ I){
DP [I] + = 1;
用(登録INT J = 1; iがjは* <= N; ++ j)は
DP [iがJ *] + = F [i]は、
//のprintf( "%D%LLD \ n"は、I、DP [I])。
}
int型S = 1。
DP [N + 1] = 2E15。
以下のために(iは2 = intを登録する; iが<= N + 1; ++ I){
IF(DP [I]> DP [I-1]){
のprintf( "{%のDは、%D、%のLLD}、\ n」は、S、I-1、
S = I;
}
DP [I] = MAX(DP [I]、DP [I-1])。
}
}
`` `
` ``
の#include <ビット/ STDC ++ H>
使用して名前空間std。
INTのANS [70] [3] = {/ *打的表* /}。
INTメイン()
{
freopenは( "b.in"、 "R"、STDIN)。
freopenは( "B.OUT"、 "W"、STDOUT)。
int型のn;
scanf関数( "%のD"、&N);
以下のために(0 = I intを登録する;私は<= 66; ++ I){
IF(N <= ANS [I] [1]){
のprintf( "%d個の\ n%dの"、ANS [I] [0] 、ANS [I] [2])。
0を返します。
}
}
}
``
##正解:


「素因数分解定理は」数の$ n $のために得ることができ、それは次のように分解することができます。

$ P_1 ^ {R1} P_2 ^ {R2} .... p_k ^ {RK} $

だから、その約数の数は次のように表すことができます

$(R_1 + 1)(R_2 + 1)···(r_k + 1)$

(簡単に乗算定理で起動)

そして、我々はまた、数についての乗法定理を起動するためにそれを使用することができます

$ P_1 ^ {R1 '} P_2 ^ {R2'} ...
[0、R_iを] $でp_k ^ {RK '} $、$ R_iを' \

明らかに、我々は、その約数の数を計算するために除数N- $ $のそれぞれを列挙することはできませんが、数の乗法の結合法則や分配法則に従って、我々は見つけることができます

$ Ans_x =(1 + 2 + ... +(R_1 1))(1 + 2 + ... +(R_2 + 1))...(1 + 2 + ... +(r_k 1) )$

ここでは難易度、これはすべてのケースで表現することができる理由を考えるのです。

実際には、それは基本的に唯一の方法N〜1予選の最小数を見つけるためにされて、解決すべき問題を解決してきた、私たちは$ \ prod_を見つける{I = 1} ^ {cntpri} PRI [i]は$
とき$でPRI [i]を= 53以上$とき$ 10 ^ {18} $を持っている、と私たちは整流時間前に素数$ 53 $を考慮すれば、素数$ 53 $よりも大きい、$ ans_x $への寄与は旧大きくなければなりません、なぜなら$ R_iと\ GEQ r_j $があります。

だから、そこになければなりません

$(1 + 2 + ... +(R_iと+1))\ GEQ(1 + 2 + ...(r_j + 1))$。

$のDFS $を考えるとき、我々はわずか$ 53 $ DFSの最大値を使用して答えを見つけるのは確実です。係数が前のものよりも大きい場合、それが最良の場合であるため、品質の指標とゲートの後ろの選択数が前より大きくすることはできません前に、強い剪定は、素数の数が記録されていることをここで注意してくださいと$ ANS同じ、話題の前に$と私たちが得た最も小さい番号を作ってみようが、後者は確かに$の$のANSとは何の関係もありません。たぶん、あなたはすべての2を選択しない理由をお願いしたいと思います。ここでは、列挙した場合$ 2 ^ 7 $と$ 2 ^ 6 \ times3の$最終的な答えは、$ 28 $と$ 21 \ times3の$でした$ ans_x $に貢献するために、それが可能であり、厳格な例単純ではないが、 。

## $ Codeing $:


`` `
の#include <ビット/ STDC ++ H>
名前空間STDを使用して、
typedefの符号なしlong longのLL。
INT PRI [] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53}。
LL ANS、ANS2、N。

インラインボイドDFS(int型のPOSは、今-1,11,11-和、INT PRE){
IF(和> ANS){
ANS =和; ANS2 =今。
}他(合計== ANS)の場合
ANS2 =(ANS2 <今)ANS2:?今、
(1 = I intを登録する;私は=プレ<&&(長い二)今* PRI [POS] <= N; ++ I){
今* = PRI [POS]。
DFS(POS + 1、今、和*(I + 1)*(I + 2)/ 2、I)。
}
}

INTメイン()
{
freopenは( "b.in"、 "R"、STDIN)。
freopenは( "B.OUT"、 "W"、STDOUT)。
scanf関数( "%のLLD"、&N);
DFS(0,1,1,100)。
printf( "%のLLDする\ n%LLD"、ANS2、ANS)。
}
`` `

おすすめ

転載: www.cnblogs.com/Pluto-Xz/p/11267618.html