1. 程式人生 > >min_25篩 學習小記

min_25篩 學習小記

終於在9102年之前搞完了這個東西。。

關於min_25篩,一種常數和寫法優於洲閣篩的神奇篩法,複雜度大概是 O ( n 3 4

log n ) O\left(\frac{n^{\frac{3}{4}}}{\log \sqrt{n}}\right)
的。我們可以利用它求一些積性函式的字首和,要求 p p 為質數時 f ( p )
f(p)
f ( p k ) f(p^k) 比較好求,並且可以做到1e10這樣子

舉個栗子,假設我們要求 i = 1 n F ( i ) \sum\limits_{i=1}^n F(i) F ( x ) = x F(x)=x 。考慮把 x x 分成質數、合數和 1 1 三類,我們先討論對 x x 為質數時求和

g ( i , j ) = k = 1 i F ( k ) [ k P m n ( k ) > P j ] g(i,j)=\sum\limits_{k=1}^i {F(k)[k\in P或mn(k)>P_j]} ,其中 P P 是質數集合, m n ( x ) mn(x) 表示 x x 的最小質因子, P i P_i 表示第i大的質數
形象地,我們可以把 g ( i , j ) g(i,j) 看成是篩素數篩了 j j 輪後剩餘的 F ( ) F() 的和,並且十分顯然地 g ( n , P ) g(n,|P|) 就是所有素數的 F ( ) F() 的和。注意我們這裡實際上是把剩餘的所有數字都視作質數帶入僅有質數滿足的柿子在算了,因此這裡算出來的並不是真正的答案

考慮怎麼求 g ( i , j ) g(i,j) ,我們只需要考慮第j次刪去了哪些數字,顯然就是最小質因子恰好為 P j P_j 的數。因此 g ( i , j ) = g ( i , j 1 ) f ( P j ) [ g ( i P j , j 1 ) g ( P j , j 1 ) ] g(i,j)=g(i,j-1)-f(P_j)\cdot[g(\lfloor\frac{i}{P_j}\rfloor,j-1)-g(P_j,j-1)] ,注意還要加上那些本身就是質數的貢獻,並且當 P j 2 > i {P_j}^2> i 的時候是沒有後面的貢獻的

顯然 m n ( n ) n mn(n)\le \sqrt n ,因此我們只需要線性篩出 n \sqrt n 個質數。並且第一維只有 n \sqrt n 個數有用

再考慮怎麼求剩餘部分。記 S ( i , j ) = k = 1 i F ( k ) [ k P m n ( k ) P j ] S(i,j)=\sum\limits_{k=1}^i {F(k)[k\in P 或mn(k)\ge P_j]} ,那麼 S ( n , 1 ) + F ( 1 ) = i = 1 n F ( i ) S(n,1)+F(1)=\sum\limits_{i=1}^n F(i)

由F(x)為積性函式可知,我們只需要列舉一個最小質數 P k P_k 和指數 e e ,考慮加上 P k e {P_k}^e 的貢獻即可,因此 S ( i , j ) = ( g ( i , P ) g ( P j 1 , j 1 ) ) + k = j P e 1 P k e + 1 i F ( P k e ) S ( i P k , k + 1 ) + F ( P k e + 1 ) S(i,j)=\left(g(i,|P|)-g(P_{j-1},j-1)\right)+\sum\limits_{k=j}^{|P|}\sum\limits_{e\ge 1且{P_k}^{e+1}\le i}{F({P_k}^e)S(\lfloor\frac{i}{P_k}\rfloor,k+1)+F({P_k}^{e+1})} ,柿子的前半部分是質數的答案,這裡查了很多個blog好像都有點問題,わからない

具體實現的話可以預處理所有可能的根號取值並離散,然後求出g。對於S的計算遞迴即可

模板

loj6053
某一天,你發現了一個神奇的函式