Min25篩詳解

gerayking發表於2020-11-25

Min25篩詳解

min25篩有什麼用?

目的: 求出 ∑ i − 1 N f ( i ) \sum_{i-1}^Nf(i) i1Nf(i)的字首和,其中前置條件為

  • f ( i ) f(i) f(i) 當i為素數時,能夠用 i k i^k ik表達,例如 f ( i ) = i 1 + i 2 + i 3 f(i)=i^1+i^2+i^3 f(i)=i1+i2+i3等形式,常見的有 ϕ μ \phi \quad \mu ϕμ函式。

  • f ( i ) f(i) f(i)是積性函式

怎麼求?

分兩步走

  • 處理素數
  • 處理合數

處理素數

素數部分

∑ i = 1 N [ i ∈ p r i m e ] f ( i ) \sum_{i=1}^N[i \in prime] f(i) i=1N[iprime]f(i)

既然素數的函式值能夠簡單的被表達那麼肯定可以求出來。

  1. 設字首和 s u m i sum_i sumi

    s u m i = ∑ i − 1 i f ( p r i m e i ) sum_i = \sum_{i-1}^if(prime_i) sumi=i1if(primei) 即前i個素數的函式值的字首和

  2. 設函式 g ( N , i ) g(N,i) g(N,i)

    g ( N , i ) = ∑ j = 1 N [ j ∈ p r i m e ∣ M i n j > p r i m e i ] ∗ f ( j ) g(N,i) = \sum_{j=1}^N[j \in prime \mid Min_j > prime_i]*f(j) g(N,i)=j=1N[jprimeMinj>primei]f(j)

    通俗的來說, g ( N , i ) g(N,i) g(N,i)就表示 N N N以內的在埃拉特斯特尼篩演算法進行第 i i i輪後尚未被篩去的數的函式值的和。

    顯然我們要求的就是
    g ( N , ∞ ) = ∑ i = 1 N [ i ∈ p r i m e ] f ( i ) g(N,\infty) = \sum_{i=1}^N[i \in prime] f(i) g(N,)=i=1N[iprime]f(i)

    其實不用到達無窮大,最大到達的為 n \sqrt{n} n 內的素數個數

考慮怎麼求出這個式子,考慮i從小往大遞推,g(N,0)的時候發現就是一個簡單的冪次字首和,這裡一般可以用公式來做。
g ( N , 0 ) = s u m ( N ) g(N,0) = sum(N) g(N,0)=sum(N)
考慮如何從 g ( N , i − 1 ) = > g ( N , i ) g(N,i-1) => g(N,i) g(N,i1)=>g(N,i)

埃篩的思路

  • p r i m e i 2 > N prime_{i}^2>N primei2>N時,顯然已經篩不出任何的數

  • p r i m e i 2 < = N prime_i^2 <=N primei2<=N時,考慮 N N N中被 p r i m e i prime_i primei篩去的數(沒有被 p r i m e i prime_i primei小的素數篩掉的數中)
    g ( N , i ) = g ( N , i − 1 ) − f ( p r i m e i ) ∗ ( g ( ⌊ N p r i m e i ⌋ , i − 1 ) − s u m i − 1 ) g(N,i) = g(N,i-1) - f(prime_i) * (g(\lfloor\frac{N}{prime_i} \rfloor, i-1 ) - sum_{i-1}) g(N,i)=g(N,i1)f(primei)(g(primeiN,i1)sumi1)
    解釋一下上面這個式子,假設 N = 16 , i = 1 N=16 , i = 1 N=16,i=1時,式子變為
    g ( N , i ) = g ( N , i − 1 ) − f ( 2 ) ∗ ( g ( 8 , 0 ) ) g(N,i) = g(N,i-1) - f(2) * (g(8, 0 )) g(N,i)=g(N,i1)f(2)(g(8,0))
    很顯然 g ( 8 , 0 ) ∗ f ( 2 ) g(8,0) * f(2) g(8,0)f(2)此時為 ( f ( 1 ) + f ( 2 ) + ⋯ + f ( 8 ) ) ∗ f ( 2 ) (f(1)+f(2)+\cdots +f(8)) * f(2) (f(1)+f(2)++f(8))f(2),因為是積性函式,所以就相當於把2的倍數的值給全都算出來了給刪除了。所以最後的出g的遞推式為
    g ( N , i ) = { g ( N , i − 1 ) p r i m e i 2 > N g ( N , i − 1 ) − f ( p r i m e i ) ∗ ( g ( ⌊ N p r i m e i ⌋ , i − 1 ) − s u m i − 1 ) p r i m e i 2 < = N g(N,i) = \begin{cases} g(N,i-1)\quad \quad prime_i^2>N\\ g(N,i-1) - f(prime_i) * (g(\lfloor\frac{N}{prime_i} \rfloor, i-1 ) - sum_{i-1}) \quad \quad \quad prime_i^2 <=N \end{cases} g(N,i)={g(N,i1)primei2>Ng(N,i1)f(primei)(g(primeiN,i1)sumi1)primei2<=N

這個式子被證明覆雜度在 O ( n 3 4 l o g N ) O(\frac{n^{\frac{3}{4}}}{logN}) O(logNn43)

處理合數

再明確一次我們需要求的答案
∑ i = 1 N f ( i ) \sum_{i=1}^N f(i) i=1Nf(i)
此時我們已經有了
∑ i = 1 N [ i ∈ p r i m e ] f ( i ) \sum_{i=1}^N[i \in prime]f(i) i=1N[iprime]f(i)
且f(i)是積性函式,那麼就很方便了

定義一個函式
S ( N , i ) = ∑ j = 1 N [ M i n j > p r i m e i ] ∗ f ( i ) S(N,i) = \sum_{j=1}^N[Min_j > prime_i] * f(i) S(N,i)=j=1N[Minj>primei]f(i)
即滿足所有最小質因子大於等於 p r i m e i prime_i primei f ( i ) f(i) f(i)的和,埃篩i輪後剩下的值

S ( N , i ) S(N,i) S(N,i)分為兩部分,剛剛的素數部分我們已經解決了
S ( N , i ) = g ( N , ∞ ) − s u m i − 1 + 合 數 S(N,i) = g(N,\infty) - sum_{i-1} + 合數 S(N,i)=g(N,)sumi1+
合數部分怎麼解決?

因為 f f f是一個積性函式,所以我們列舉合數的最小質因子及其出現的次數即可
∑ j = i p r i m e j 2 < = N ∑ k = 1 p r i m e j k < = N ( S ( ⌊ N p r i m e j k ⌋ , i − 1 ) ∗ f ( p r i m e j k ) + f ( p r i m e j k + 1 ) ) \sum_{j=i}^{prime_j^2<=N}\sum_{k=1}^{prime_j^k<=N}(S(\lfloor \frac{N}{prime_j^k} \rfloor,i-1)*f(prime_j^k) +f(prime_j^{k+1})) j=iprimej2<=Nk=1primejk<=N(S(primejkN,i1)f(primejk)+f(primejk+1))
解釋一下這個很長的和式

第一部分列舉從第i個質數開始列舉,因為當前是第i輪 p r i m e j prime_j primej

第二部分則列舉這個質數的冪次

後面一部分跟求 g g g的思路是類似的,最後加上 f ( p r i m e j k + 1 ) f(prime_j^{k+1}) f(primejk+1)是因為當 N p r i m e j k = 0 \frac{N}{prime_j^k}=0 primejkN=0時,進入的話會返回0,所以在外面加上,例如S(1,0)時,我們會直接返回0,f(8)則沒有計算到。

完了,min25篩結束了

主要的解題思路為:

  • 分塊
  • 處理素數的字首和
  • 寫S函式
  • 求答案

因為這裡用到的所有的數都是 N i \frac{N}{i} iN的形式,所以很顯然的可以進行分塊處理。

模板題

LOJ 6053

相關文章