問題の意味
[1、n]を求めて除数、除数の数に関する最大のカウント間隔を有しており、例えば、これらの数値が持つ約12 1,2,3,4,6,12数として、彼女の周りにそのカウント値を出力します。 1,2,2,3,4,6が約12〜約18の数その後数数、約。
データの100%に、N <= 1E18
問題の解決策
暴力はかなりミスです
const int型 MAXN = 2000005 ; LLのn; LL NUM [MAXN]和[MAXN]。// 约数个数、约数的约数和 LL ANS; INT メイン(){ scanf関数(" %のLLD "、&N) 以下のために(int型私= 1 ; iが<= N; iが++ ){ NUM [I] ++ ; 和[I] + = NUM [I]。 もし(SUM [I]>和[ANS])ANS = I。 用(LL J = 2、J = +; J <= N * I {I) NUM [J] ++ ; 合計[J] + =NUM [i]は、 } } // (I = 1をint型、iが<= N; iが++)のためのprintf( "%dの"、和[I])。 printf(" %d個の\ n%D " 、ANS、和[ANS])。 }
持っていたテーブルを再生するために何かを見つけたい、答えは1E7の範囲内、範囲の管轄下になりますが70未満だった、といくつかの間隔の長さは、契約の数を数える程度までで、単一の長さの増加をからスタートしたかったが、いませんでした、GGに。
何か正のソリューションは、数論です。
数nの場合は、Pに分解することができる1。R1 P 2 R2 ... Pのm個のRM、彼の数は数(R1 + 1)(R 2 +についてです 1)...(RM + 1) 番目。
これと同時に、インデックスのみ関連の少数について、上から見ることができる相では、R分周数I > = R&LT I + 1は良くなります。
Nの除数との乗算の分配法則(P1 + P1。1 + 2 + ... P1 R1)(P2 + P2 1 + 2 + ... P2 R2)...(PM + PMの+。1 2 +。 ..pmのRM)、その後、アナログの数の上では除数の数(1 + 2 + ... +(約ある R1 + 1))(1 + 2 + ... +(R2 + 1))...( 1 + 2 + ... +(RM + 1))、 一つは選択した各括弧内の数字を想像することができ、それは、約た数から、対応する借入のほとんどを左指数除数を一致させる方法であろう番号は同じです。
これは、関連する指標、R&LTを発見することができるI > = R&LT Iは+ 1が良くなります
そして、素数の数は53までの異なる1E18に分割され、それがバースト検索することができ
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #defineは長い長いっ LL N。 INTプライム[ 20 ] = { 0、2、3、5、7、11、13、17、19、23、29、31、37、41、43、47、53 }。 ANS2、ANS1 LL; 無効 DFS(int型の POS、LLのRET、LL NUM、int型最後){ 場合(右> n)のリターン; もし(NUM> ANS2){ ANS2 = NUM。 ANS1 = 右。 } そうで あれば(NUM == ANS2) ANS1 = 私(ANS1、右)。 以下のために(int型 i = 1 ; iが<=最後右&& <= N /プライム[POS]; iは++ ){ 右 * = プライム[POS]。 DFS(POS + 1、右、NUM *((I + 1)*(I + 2))/ 2 、i)は、 } } のIntメイン(){ freopenは(" b.in "、" R " 、STDIN)。 freopenは(" B.OUT "、" W " 、STDOUT)。 scanf関数(" %のLLD "、&N) DFS(1、1、1、60 )。 printf(" %のLLDする\ n%LLD " 、ANS1、ANS2)。 }