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] = 1。P = [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 ; }