Min25篩詳解
Min25篩詳解
min25篩有什麼用?
目的: 求出 ∑ i − 1 N f ( i ) \sum_{i-1}^Nf(i) ∑i−1Nf(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=1∑N[i∈prime]f(i)
既然素數的函式值能夠簡單的被表達那麼肯定可以求出來。
-
設字首和 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=i−1∑if(primei) 即前i個素數的函式值的字首和
-
設函式 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=1∑N[j∈prime∣Minj>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=1∑N[i∈prime]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,i−1)=>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,i−1)−f(primei)∗(g(⌊primeiN⌋,i−1)−sumi−1)
解釋一下上面這個式子,假設 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,i−1)−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,i−1)primei2>Ng(N,i−1)−f(primei)∗(g(⌊primeiN⌋,i−1)−sumi−1)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=1∑Nf(i)
此時我們已經有了
∑
i
=
1
N
[
i
∈
p
r
i
m
e
]
f
(
i
)
\sum_{i=1}^N[i \in prime]f(i)
i=1∑N[i∈prime]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=1∑N[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,∞)−sumi−1+合數
合數部分怎麼解決?
因為
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=i∑primej2<=Nk=1∑primejk<=N(S(⌊primejkN⌋,i−1)∗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的形式,所以很顯然的可以進行分塊處理。
模板題
相關文章
- HackerRank-Coprime Power Sum-類min25篩的DP
- yolov5 篩選正樣本流程 程式碼多圖詳解YOLO
- 素數篩 : Eratosthenes 篩法, 線性篩法
- 素數篩(埃氏篩法與尤拉篩)
- 埃氏篩/線性篩+質數與約數一本通題解
- 尤拉篩(線性篩)
- 尤拉篩線性篩質數
- 線性篩質數 題解 luoguP3383
- P10532 [XJTUPC2024] 篩法 題解
- geojson格式篩選及處理的解決方案JSON
- 素數個數 <埃式篩 && 尤拉篩>
- 素數篩
- 質數篩
- 尤拉篩
- 杜教篩
- Android開商品屬性篩選與商品篩選Android
- 動態篩選
- jQuery 篩選方法jQuery
- 外包篩選心得
- http協議/cookie詳解/session詳解HTTP協議CookieSession
- 信奧日記——數論(快速冪、埃氏篩、尤拉篩)
- Java註解最全詳解(超級詳細)Java
- Java註解詳解Java
- Lombok 註解詳解Lombok
- @FeignClient註解詳解client
- Java 註解詳解Java
- wpf ObservableCollection篩選功能
- 杜教篩入門
- 肇篩敢滋廝
- 線性篩合數
- ECharts 詳解Echarts
- Dialogment詳解
- hibernate詳解
- 詳解bind
- 詳解GOPATHGo
- nginx 詳解Nginx
- HTTP 詳解HTTP
- StreamingContext詳解GCContext