トピックへのリンク:http://acm.hdu.edu.cn/showproblem.php?pid=6588
タイトル効果:シーク\(\ sum_ {i = 1} ^ {n}はGCD(\左\ lfloor \ SQRT [3] {I} \右\ rfloor、I)、\ n個の\の当量10 ^ {21} \)
溶液:考える\ \(\ sum_ {i = 1} ^ {\ \ SQRT \ lfloor左[式に変換し、ブロック(\ \ lfloor \ SQRT [3] {I}右\ \ rfloor \を左) 3] {N} \右\ rfloor} \ sum_ {J = ^ 3} ^ {(I + 1)^ 3-1} GCD(I、J)\)
関数\ \(GCD(X、Y)= GCD(X \ MOD \ Y、Yので(F(N、M)= \ sum_ {i = 1} ^ {M} GCDを(N、I)\)、検討)\)、誘導することができる$$のF(N、M)= \ sum_ {i = 1} ^ {M} GCD(N、I)= \左\ lfloor \ FRAC {M} {N} \右\ rfloor \ CDOTのF(N、N)+ F(nは、MODの\ n \ M)$$
値について\(fが(N、N)\)\(GCD \)由来の和の値で列挙することができる\(F(N、N)= \ sum_ {D | N} ^ {} D \ CDOT \ PHI(\ FRAC {n}は{D})\)、オイラー関数の値は、線形プリスクリーニング\(O(nlogn)\)全ての前\(F(N、N)\)の値とすることができます
对于\(F(N、M)\)、同样可以得出、\(F(N、M)= \ sum_ {D | N} ^ {} D \ sum_ {I | \ FRAC {n}は{D} 、I MU \ \当量\左\ lfloor \ FRAC {M} {D} \右\ rfloor} ^ {}(I)\ CDOT \左\ lfloor \ FRAC {M} {ID} \右\ rfloor = \ sum_ {D | N} ^ {} \ PHI(D)\ CDOT \左\ lfloor \ FRAC {M} {D} \右\ rfloor \)
また、ので、\は、((I + 1)^ 3-1 = I ^ 3 + 3I ^ 2 + 3I \)、(Iは\)各サイクル\のためにそこに、複数の\(Iは\)であるので、$$ \ sum_ {J = ^ 3} ^ {(I + 1)^ 3-1} GCD(I、J)= F(I、I ^ 3 + 3I ^ 2 + 3I)-f(I、I ^ 3 )+ GCD(I、I ^ 3)=(3I + 3)\ CDOT F(I、I)+ I $$
従って、各質問のために、多くとも一度だけ必要\(F(N、M)\)(すなわち、最後の\(Iは\))のような、\のために(F(N、M)\)時間計算度\(O(\ SQRT {N})\)、そのため、各クエリの複雑\である(O(N + \ SQRT {N})\)。そして^ 7 10(\(n-は\)\を指し、セット質問複数のオフライン処理を削減全体の時間複雑度\(O(nlogn + T \のSQRT {N})\)を考慮することができるため\)
人々の話題は、この質問はもともとカード非線形のアプローチだったが、ある一定の最適化によって可能に\(O(nlogn)\)の実践を通して
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 の#define N 10000001 4 の#define MOD 998244353 5 int型 N、G [N]、PHI [N]、P [N]、CNT、RES [ 15 ]、FLG [N]。 6 構造体RUA 7 { 8 int型のID; 9 __int128 N。 10 ブール 演算子 <(CONSTの RUA&T)のconst { 戻り N < TN;} 11 } [ 15 ]。 12 ボイド読み取り(__ int128&X) 13 { 14 静的 チャー CH。静的 ブールNEG。 15 のために(CH = NEG = 0 ; CH < ' 0 ' || ' 9 ' <CH; NEG | = CH == ' - '、CH = GETCHAR())。 16 のための(X = 0 ; ' 0 ' <= CH && CH <= ' 9 ' ;(X * = 10)+ = CH- ' 0 '、CH = GETCHAR())。 17 のx = NEG - ?X:X; } 19 ボイドpretype() 20 { 21 PHI [ 1 ] = 1 。 22 のためには、(int型、I = 2 ; iがNを<; iは++ ) 23 { 24 場合のp [++ CNT] = I、PHI [i]は= I-(FLG [I]!)1 。 25 のための(int型 J = 1 ; J <= CNT && iは* P [j]は<N; J ++ ) 26 { 27 FLGが[iが* P [j] = 1 。 28 もし(I%のP [j] == 0 ) 29 { 30 PHI = P [j] * [iがj]を[Pを*] [i]はPHI。 31 ブレーク; 32 } 33 PHI =(P [J] - [Iは、p [j] *] 1)* [I] PHIを。 34 } 35 } 36 のために(INT D = 1、D * D <Nを; D ++ ) 37 のための(INT ; N <N N + = = D * DのN D) 38 { 39 G [N] =(G [N ] + 1LL * D * PHI [N / D])%MOD。 40 であれば(D *はdの<N)G [N] =(G [N] + 1LL×(N / D)* PHI [D])%MOD。 41 } 42 } 43インラインINT F(int型nは、__ int128のM) 44 { 45 INT RES =(M / N)* G [N]%MOD。 46 INT M = M%N。 47 もし(m個の== 0)戻りRES。 48 のためには、(int型 i = 1 ; iが* I <= N; iは++ ) 49 { 50 のint J = N /(N / I)。 51 であれば(N%I == 0 ) 52 { 53の ([I] *(M / I)RES + 1LL * PHI)%のRES = MOD。 54 場合のRES =(iはiがn <*)(RES + 1LL * PHI [N / I] *(M /(N / I)))%MOD。 55 } 56 、I = J。 57 } 58の リターンRES。 59 } 60 のint main()の 61 { 62 pretype()。 63 のscanf(" %d個"、&N) 64 のためには、(int型 i = 1 ; iがn = <; iは++ ) 65 リード([I] .N)を、[I] .ID = I。 66 ソート(A + 1、+ N + 1 )。 67 int型 ANS = 0、J = 1 ; 68 __int128 I = 1 。 69 一方(iは* I <= [N] .N) 70 { 71 __int128 R =((I + 3)* I + 3)* I。 72件 のANS =(ANS + MOD-(iは[I]%MODグラム*)+ I)%MOD。 73 一方、(j <= N && [J] .N < R) 74 { 75 RES [J] .ID] =(ANS + F(I、[J] .N%I)+([ J] .N / I)* G [i])と%MOD。 76 J ++ ; 77 } 78 のANS =(ANS +((I +3)* I + 3)* G [i])と%MOD。 79 一方、(j <= N && [J] .N == R) 80の RES = [J ++] ID] ANS。 81 私は++します; 82 } 83 のための(int型 i = 1 ; iが<= N; iが++ ) 84 のprintf(" %d個の\ n " 、RES [I])。 85 }