リンク:https://ac.nowcoder.com/acm/contest/82/A
出典:牛オフネットワーク
制限時間:C / C ++ 1秒、2秒言語は、他の
スペースの制限:C / C ++ 262144K、他の言語の524288Kの
64ビットIOフォーマット:LLD%
スペースの制限:C / C ++ 262144K、他の言語の524288Kの
64ビットIOフォーマット:LLD%
タイトル説明
トン呼び掛け回、あなたが番号を教えnは、見つけるたびに[を。1 nは、]について、カウント数の最大数の約数の中
説明を入力します。
正の整数tの最初の行
T列の各正の整数nの後
出力説明:
出力T線、各回答を表す整数
備考:
データの100%に、T <= 500、1 < = N <= 1000000000000000000のアイデア:正の整数nは、私たちができる唯一の分解のn = P1 ^(X1)* P2 ^(×2)* P3(X3) ... * PK ^(XK)数N(X1 + 1)*(X2の除数である + 1)*(X3 + 1)* ... *(XK + 1) ここで、P1 <P2 <P3 < P4 ... <PK およびX1> X2> X3> X4> ...> XK 質量数の法則に従って数が大きくないの番号を見つけるために、ときに我々が最大数n個程度以上n以下の数を列挙することができます。注意すべきもう一つのポイントは、品質の少数の力ではない、ということですこれが最善ではないので、彼の素数より大きいの力が、ゼロではないが、ゼロです。私たちが欲しいのは、最適な最大数ではなく、小さな素数の大きな素数の力ならば除数の最大数、除数の数は、上記の式から分かるように、同じ時間数でほぼ同数、総素数を乗じ小さいほど、小さな値の値だけでなく、除数の数が多くなることができ、上述を証明することが可能です。なぜなら素数の力を満たすために逓減の法則の、素数のべき乗を定義するための上限と列挙型変数。、詳細には、コードを参照してください。
#include <iostreamの> する#include <cstdioを> する#include <CStringの> する#include <アルゴリズム> の#include <cmath> の#include <キュー> の#include <スタック> の#include <地図> の#include < セット > の#include <ベクトル> #include <iomanip> の#define ALL(X)(X).begin()、(X).END() の#defineを返すRT の#define DLL(X)のscanf( "%I64d"、およびX) の#define XLLを(X )のprintf( "%I64dの\ n"、X) の#define SZ(A)INT(。 サイズ()) の#defineすべて(A)a.begin()、a.end() の#define担当者(I、X、n)のための式(I = xをint型、iがN <; Iは++) の#define(; iが<= N; I = xをint型私は++)のためrepd(I、X、N) の#define PII対< int型、int型> の#define PLLペア<長い長い、長い長い> に#define gbtbイオス:: sync_with_stdio(偽)、cin.tie(0)、cout.tie(0) の#define MS0(X)のmemset((X) 、0、はsizeof((X))) の#define MSC0(X)のmemset((X)、 '\ 0'はsizeof((X))) の#define PB一back の#define融点make_pair の#define Fiの第一 の#define SE第二 #define EPS 1E-6 の#define GG(X)のgetInt(&X) の#define DB(X)COUT << "== [ "<< X <<"] ==" << ENDL。 使用して 名前空間をSTD; typedefの長い 長いLL。 LLのGCD(-1,11,11- b)は{ 戻り B GCD(B、%の?B);} LLのLCM(-1,11,11- b)は{ 返す / GCD(a、b)は* ; Bは} LL powmod {LL ANS(MOD -1,11,11-のB、LL) = 1。一方、(b)は、{ もし、(B%2)ANS = ANS *%MOD; = *%MOD; B / A = 2 ;} 戻りANS;} インラインボイドのgetInt(int型 *のP)。 const int型 MAXN = 1000010 ; const int型 INF = 0x3f3f3f3f 。 / ***テンプレートコード* *ここから始まる** * / int型 NOPRIME [MAXN + 5 ]。 std ::ベクトル < 整数 > のp; ボイドgetprime() { int型、M = SQRT(MAXN + 0.5 )。 以下のために(int型 I = 2 ; I <= M; iは++ ) { ため(int型 J = i *がI、J <= MAXN; J + = I) { NOPRIME [J] = 1 。 } } repd(I、2 、MAXN) { 場合(!NOPRIME [i])と { p.push_back(I)。 } } } LL [ 500 ] = { 2、3、5、7、11、13、17、19、23、29、31、37、41、43、47 }。 LL ANS = 0LL。 LLのn; ボイド DFS(LLのX、int型の ID、int型の制限、LLのNUM) { ANS = MAX(ANS、NUM)。 もし(ID> = 15 ) { リターン。 } のLL TEMP = [ID]。 用(INT J = 1 J ++; J <=限界) { 場合(X <= N / TEMP) { DFS(図示X *の温度、ID + 1、J、NUM *(J + 1 ))。 TEMP * = [ID]。 } 他 { 破ります。 } } } int型)(主 { //freopenは( "D:\\ common_text \\ code_stream \\ in.txt"、 "R"、STDIN)。 // freopenは( "D:\\ common_text \\ code_stream \\ out.txtを"、 "W"、STDOUT)。 int型のトン。 gbtb; // coutの<<(1LL << 60)<<てendl; // coutの<<(LL)1E18 <<てendl; cinを>> トン。 一方、(t-- ) { CIN >> N。 ANS = 0LL。 DFS(1LL、0、60 、1LL)。 coutの << ANS << てendl; } 戻り 0 。 * P){ チャーCH。 実行{ CH = GETCHAR()。 } 一方、(CH == ' ' || CH == ' \ n ' ); もし(CH == ' - ' ){ * P = - (GETCHAR() - ' 0 ' )。 一方、((CH = GETCHAR())> = ' 0 ' && CH <= ' 9 ' ){ * p = * P * 10 - CH + ' 0 '。 } 他{ * P = CH - ' 0 ' 。 一方、((CH = GETCHAR())> = ' 0 ' && CH <= ' 9 ' ){ * p = * P * 10 + CH - ' 0 ' 。 } } }