codeforces364D

GHD

 CodeForces - 364D 

ジョン・ドウは彼の姉ジェーン・ドウは、数字のいくつかのセットの最大公約数を見つける提供します 

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 = 0BOOL F = 0CHAR 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] .nu​​m = B [ 1]; C [CNT] .CNT = 1 以下のための(I = 2 iが++; iが<= N 
    { 
        場合(!B [I] = B [I- 1 ]){C [++ CNT] .nu​​m = [I] B。C [CNT] .CNT = 0 ;} C [CNT] .CNT ++ 
    } 
    ため(i = 1 ; iが= CNTを<; iは++ 
    { 
        int型の和= 0 (J = 1、J ++; J <= CNT)であれば(C [J] .nu​​m%C [i]は.nu​​m == 0)合計+ = C [J] .CNT。
        もし(和> = M)ANS = MAX(ANS、C [i]の.nu​​m)。
    } 
} 
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 
* /
コードの表示

 

 

おすすめ

転載: www.cnblogs.com/gaojunonly1/p/11221736.html