GHD
ジョン・ドウは彼の姉ジェーン・ドウは、数字のいくつかのセットの最大公約数を見つける提供します 。
GCDは、正の整数であり、 G組からのすべての数により均等に分割されているように、 G とそのような存在しない G「 (G」> Gはセットのすべての数が割り切れるであること、) G」。
残念ながら、ジェーンはタスクに対処することができませんでしたし、ジョンは数字の同じサブセットのGHDを見つけるために彼女を提供しました。
GHDは、正の整数であり、 G組から数の少なくとも半分が割り切れるであるように、 G とそのような存在しない G「 (G」> Gがセットから数の少なくとも半分が均等に割り切れるであること) グラム」。
ジェーンは2時間の作業で対応しました。あまりにも、それを試してみてください。
入力
最初の行は、整数含ま N (1≤ N ≤10 6多くの番号が設定されている様子を示します) 。2行目は空白で区切られた整数含ま 1、 2、...、 N(≤1 iは ≦10 12)。指定されたセットに含めることができることに、注意してください 同数。
、書き込みしないでください С++で64ビット整数を読み取りまたは書き込みに%のLLD指定子を。使用するのが好ましい %I64d指定子を。
出力
単一の整数を印刷 グラム セットのGHD - 。
例
入力
6
6 2 3 4 5 6
出力
3
入力
5
5 5 6 10 15
出力
5
そのイタリア:数の-Nの半分、その結果最大GCD
ソル:鬼畜一見ランダムアルゴリズム、及び毎回ランダムに選択され、そしてそのGCD全ての数は算出し、決定するものの半分のような乱数を満たしますインクルード
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 typedefの長い 長いLL。 インラインLLリード() { LL S = 0。BOOL F = 0。CHAR CH = ' ' ; しばらく(!isdigit(CH)){F | =(CH == ' - '); CH = GETCHAR();} ながら(isdigit(CH)){S =(S << 3)+(S << 1)+(CH ^ 48)。CH = GETCHAR();} リターン(F)(? - S):( S)。 } の#defineR(x)は、x =リード() インラインボイドライト(LLのX) { 場合(X < 0){のputchar(' - ')。X = - X;} もし(X < 10){のputchar(X + ' 0 ')。返す;} 書き込み(X / 10)。putchar((X%10)+ ' 0 ' )。 } の#define W(x)は書き込み(X)のputchar( ' ') の#define WL(X)の書き込み(X)のputchar('の\ n') のconst int型 N = 1000005 。 INTのN、M。 LL [N]、CNT= 0、B [N]、ANS = 0 。 構造体ノード{NUM LL。INT CNT;} C [N]。 インラインLLのGCD(LLのB、LL) { リターン(A):( GCD(B、%の(B!)?b)参照)。 } インラインボイドは()解決 { LL TMP = A [ランド()%N + 1 ]。 // coutの<< "TMP =" << TMP <<てendl; int型I、J。 以下のための(I = 1、B [I] = iが++; iが<= N)GCD([I]、TMP)。 ソート(B + 1、B + N + 1 )。 CNT = 0 ; C [++ CNT] .num = B [ 1]; C [CNT] .CNT = 1 。 以下のための(I = 2 iが++; iが<= N ) { 場合(!B [I] = B [I- 1 ]){C [++ CNT] .num = [I] B。C [CNT] .CNT = 0 ;} C [CNT] .CNT ++ 。 } ため(i = 1 ; iが= CNTを<; iは++ ) { int型の和= 0 。 用(J = 1、J ++; J <= CNT)であれば(C [J] .num%C [i]は.num == 0)合計+ = C [J] .CNT。 もし(和> = M)ANS = MAX(ANS、C [i]の.num)。 } } INT)(主 { srand関数(2003.031万); int型私は、 R(n)が、 用(i = 1 ; iが<= N; iは++ )R([I])。 M =(N + 1)/ 2 。 用(i = 1 ; iは= < 10 ; iが++ (解決))。 WL(ANS)。 リターン 0 ; } / * 入力 6 6 2 3 4 5 6 出力 3 入力 5 5 5 6 10 15 出力 5 * /