牛オフNOIPのサマーキャンプ7日 - 4676 - グループ5 HDU向上させるために:GCDの合計モリブデン(Mo&チーム間隔GCD式)CodeForces - 645F:Cowslipコレクション(組み合わせ&&オイラー関数の数)

A:ABSデコさん水問題は、最初%、差約次いで数二つの隣接する分()。

#include <ビット/ STDC ++ H>
 の#defineは長い長いllの
 使用 名前空間STDを、
const  int型 MAXN = 10000000 ;
const  int型のMod = 998244353 ;
INT [MAXN]。ANS LL;
INT のmain()
{ 
    int型N、D。
    scanf関数(" %dの%のD "、&​​N、&D)。
    int型 iは= 1のscanf(私は++; iが<= N)" は%d "、&​​[i])と、[i]は%= Dと、
    int型 iは= 2 iが= Nを<; I ++){
         int型、T = ABS([I] -a [I- 1 ])。
        ANS + =分(T、D- T)
    } 
    のprintf(" %LLDする\ n " 、ANS)。
    リターン 0 ; 
}

 

B:デコGCD配列[]、二十から二GCDを求めるの生成物を得ました。

もちろん、ペアごとのGCDの合計は当たり前の反転がある場合。

あなたはを参照することができ、しませんでした。

      GCD(モリブデン&チーム間隔GCD方程式)の合計:4676 - HDU codeforces - 645 F:コレクション(組み合わせ&&オイラー関数の数を)Cowslip      

1が、ここでそれはイライラそれの産物です。当社は、下記の合計と反転に掛けることができます。

2は、乗算のために、別の観点、および乗法関数から、私たちはそれぞれの素数のために分けて考えます。同じ素数pについて、その寄与がそれぞれのpのどのように多くの数を決定する分の動作を取ることです、その後、接頭辞についてベースと統計は、あなたが貢献してカウントすることができます。オイラーは、(私が降順GGを忘れてしまった)降順にも注意してください。

各素数のその処理能力。

1、ルートアルゴリズム、単語の複雑さの平方根があります。

2、SQRT以内プレ素数、128番目。128ワード複雑。

図3に示すように、各レコード番号P [i]のためのふるい最小の素数の素数。加えて、それができ、常にP [i]は、1まで、18 <の複雑。

#include <ビット/ STDC ++ H>
 の#define担当者(iは、、B)のための式(I ++ iは= int型;私は= Bを<)
 使用して 名前空間STDを、
const  int型 MAXN = 1000010 ;
const  int型のMod = 998244353 ;
INT VIS [MAXN]、P [MAXN]、CNT、ANS = 1 、K、P [MAXN]。
INT qpow(INT A、INT X){
     int型 RES = 1一方、{(x)の
         場合(X&1)RES = 1LL *解像度*%のMod。
        X >> = 1= 1LL * *%のMod。 
    }リターンのres; 
} 
ボイドのinit()
{ 
    ためint型 I = 2、I <MAXN; iは++ ){
         場合(!VIS [i])とのp [++ CNT] = I、Mnは[I] = MOD、P [I] = 私;
        INTの J = 1 ; J <= CNT && iは* P [j]が<MAXN; J ++ ){ 
            VIS [iが Pを* [J] = 1P = [Iは、p [j] *] のp [jを]。
            もし(!(I%P [J]))   休憩
        } 
    } 
} 
int型 G [MAXN] [ 20 ]。
INT のmain()
{ 
    int型N、Q、X; 
    その中に(); 
    scanf関数(" %のD "、&N)。
    担当者(I、1 、N){ 
        scanf関数(" %のD "、&x)は、
        一方、(X> 1 ){
             int型 T = P [x]は、RESが= 0 ;
            一方、(X%T == 0)は、x / = T、G [T] [++ RES] ++ ; 
        } 
    } 
    担当者(I、1 、CNT){
         int型の和= 0 以下のためのint型 J = 1 ; J <= 18 ; J ++){
             int型 T = G [P [I] [J]。
            もし(T <= 1ブレーク
            (和 + = 1LLの*さt *(T- 1)/ 2%(Mod- 1))%=(Mod- 1 )。
        } 
        ANS = 1LL * ANS * qpow(P [i]は、合計)%のMod。
    } 
    のprintf(" %d個の\ n " 、ANS)。
    リターン 0 ; 
}

 

C:デコのSTR

問題の意味:同形= T間隔を対応する位置毎サイクルのS valの中央値は、valの位置及び隣接プロットを見つけます。

思考:Sは同型のサイクルであればそれぞれの場所の値を取得する方法、複雑さが高くなります。したがって、Tは、{M}の新しい文字列を生成し、Mサイクルに同形である考慮して、それぞれの新しい文字列が表示された回数、および各位置のためのval = {}は、文字列の出現回数に対応して記録。そして、明らかにあなたは、保険のために、あなたはハッシュを倍増することができ、ハッシュを行うことができます。

#include <ビット/ STDC ++ H>
 に#define ULL符号なし長い長
 の#define担当者(iは、、B)のための式(I ++ iは= int型;私は= Bを<)
 使用して 名前空間STDを、
const  int型 MAXN = 10000010 ;
const  int型のMod = 1E9 + 7 INTシード= 131 ULL P [MAXN]、H [MAXN]、FCY。
チャー [MAXNを]、B [MAXN]。int型ANS; 
unordered_map <ULL、int型 > 融点; 
ULL GETHASH(int型 L、INT R)
{ 
    戻り [1- -h H [R] 1 ] * P [R-L + 1]; 
} 
int型のmain()
{ 
    int型 N、M。scanf関数(" %sの%sの"、A + 1、B + 1 )。
    Nの =のSTRLEN(A + 1)。Mの=のSTRLEN(B + 1 )。
    もし(N <M * 2リターンプット(" 0 ")、0 
    P [ 0 ] = 1 ; 担当者(I、1、N)P [I] = P [I- 1 ] * シード; 
    担当者(I、1、N)H [I] = hの[I- 1 ] *種子+ [I] - ' '+ 1 
    担当者(I、1、M)FCY = FCY *シード+ B [i]は- ' ' + 1 
    MP [FCY] ++ ; 
    担当者(I、1、M)FCY =(fcy-(B [I] - ' ' + 1)* P [M- 1 ])*種子+ B [i]は- ' ' + 1、MP [FCY ] ++ ; 
    担当者(I、1、N + 1 -M- M){ 
        ULL A = GETHASH(I、iはM- + 1)、B = GETHASH(iはMを+、iがM + M- + 1 )。
        もし(mp.find(A)== mp.end())続け;
        もし(mp.find(B)== mp.end())続けます
        ANS = ANS + 1LL * MP [A] * MP [B]%のMod。
        もし(ANS> = MOD)ans- = モッド。
    } 
    のprintf(" %d個の\ n " 、ANS)。
    リターン 0 ; 
}

 

 

 

おすすめ

転載: www.cnblogs.com/hua-dong/p/11404717.html