ドゥは、子ふるいを教えます

ドゥは、ふるいコア式を教えます

$ gを(1)S(N)= \和\ limits_ {i = 1} ^ N(のF *のG)(I) - \和\ limits_ {I = 2} ^ NG(I)S(\ lfloorの\のFRAC {N} {I} \ rfloor)$

$ S $要求と$ F $の接頭辞では、$ G $は構造の関数であります

$ G $ $ G $プレフィックスが満たすと$のF * Gは$するために必要とOを$(1)$得

$ N $は最大範囲、$ N2 $ $ N ^ {2/3} $、$ N3 $の$ N ^ {1/3} $です。

$ int型$よりもスコープで$マップ$と$合計$ $ N $上の$ LL $を変更するには

データのときは複数のセット、コールのinitの始まりに過ぎない、データマップの各セットはクリアされません後

const int型N2 = 5E6 + 10。
int型のCNT、[N2]、P [N2] F、VIS [N2]。
マップ<int型、int型> S2; 
INITを無効(){ 
    [1] 1 = F。
    REP(I、2、N2-1){ 
        (!VIS [i])とする場合、P [++ CNT] = I、[I] =((LL)iは、I-1 *)%のP、F。
        用(INTのJ = 1、T; J <= CNT && iは* P [j]が<N2; ++ J){ 
            VIS [T = iは* P [j] = 1。
            {;破る[I] * P [j]は%Pは* P [J]%のP F F [T] =(LL)}(I%P [j] == 0)であれば
            、[T] =(LL F )[I] * [P [J]%のP F F。
        } 
    } 
	[I] =(F [I] + F [I-1])%のP F REP(I、2、N2-1)。
} 
INT G(int型N){リターン1;} 
int型sum_g(INT N){戻りN;} 
int型sum_fg(INT N){リターン(LL)N *(N + 1)%のP×(2 * N + 1 )%P * INV6の%P;} 

int型の和(INTのN){ 
    [n]はF IF(N <N2)のリターン;
    (S2.count(N))S2を返す場合、[N]。
    INT ANS = sum_fg(N)(N)、MX = SQRT。
    REP(I、2、MX)ANS =(ans-(LL)G(I)*合計(N / I))%のP。
    { - (; iが<= N K Iがj + 1 = I = MX + 1、J、K = N / I INT)のために
        ; J = N / kは 
        ANS =(ans-(LL)(sum_g(J)-sum_g(I-1))*合計(K))%のP。
    } 
    [n]はS2を返す= ANS。
} 

ボイドのinit(){ 
    fは[1] = 1。
    REP(I、2、N2-1){ 
        P [++ CNT] [I] = 1、F = I、IF(VIS [I]!)。
        用(INTのJ = 1、T; J <= CNT && iは* P [j]が<N2; ++ J){ 
            VIS [T = iは* P [j] = 1。
            もし(私の%のP [j] == 0){F [T] = 1;ブレーク;} 
            [I] * F [P [J]%のP、F [T] F =(LL)。
        } 
    } 
	[I] =(F [I] + F [I-1])%のP F REP(I、2、N2-1)。
}
INT和(INTのN){ 
    [n]はF IF(N <N2)のリターン; 
    (S2.count(N))S2を返す場合、[N]。
    INT ANS = sum_fg(N)(N)、MX = SQRT。
    REP(I、2、MX)ANS =(ans-(LL)G(I)*合計(N / I))%のP。
    { - (; iが<= N K Iがj + 1 = I = MX + 1、J、K = N / I INT)のために
		; J = N / kは 
		ANS =(ans-(LL)(sum_g(J)-sum_g(I-1))*合計(K))%のP。
    } 
	IF(ANS <0)ANS + = P。
    S2を返す[N] = ANS。
}

ように書かれたマップがないと、タイムスタンプ付きの$五$に必要なデータの各セットはクリアされます。

const int型N2 = 5E6 + 10。
const int型N3 = 2510; 
INT CLKを、CNT、[N2]、P [N2] F、VIS [N2]。
INT S2 [N3]、V [N3]。
INITを無効(){ 
    [1] 1 = F。
    REP(I、2、N2-1){ 
        P [++ CNT] [I] = 1、F = I、IF(VIS [I]!)。
        用(INTのJ = 1、T; J <= CNT && iは* P [j]が<N2; ++ J){ 
            VIS [T = iは* P [j] = 1。
            もし(私の%のP [j] == 0){F [T] = 1;ブレーク;} 
            [I] * F [P [J]%のP、F [T] F =(LL)。
        } 
    } 
	[I] =(F [I] + F [I-1])%のP F REP(I、2、N2-1)。
} 
int型の和(INTのN){ 
    [n]はF IF(N <N2)のリターン; 
	INT X = N / N。
	IF(V [X] == CLK)リターンS2 [X]。
	V [X] = CLKを、
	INT&ANS = S2 [X] = sum_fg(N)、MX = SQRT(N)。
    REP(I、2、MX)ANS =(ans-(LL)G(I)*合計(N / I))%のP。
    { - (; iが<= N K Iがj + 1 = I = MX + 1、J、K = N / I INT)のために
		; J = N / kは 
		ANS =(ans-(LL)(sum_g(J)-sum_g(I-1))*合計(K))%のP。
    } 
	IF(ANS <0)ANS + = P。
    ANSを返します。
}

 

おすすめ

転載: www.cnblogs.com/uid001/p/11447597.html