ドゥは、ふるいコア式を教えます
$ 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を返します。 }