關於min_25篩的一些理解

關於min_25篩的一些理解

若是想看如何篩個普通積性函數啥的,就別往下看了,下面沒有的(QwQ)。
下文中,全部的\(p\)都表明質數,\(P\)表明質數集合。
注意下文中定義的最小/最大質因子都是默認全部質因子本質不一樣。
\(2*2*3*4*5*5\)的最小/次小質因子都是\(2\),最大/次大質因子都是\(5\)函數

step1. 適用條件與思想

min_25篩用於求積性函數前綴和,即\(\sum_{i=1}^n f(i)\)
min_25篩相比於傳統篩法來講(如莫比烏斯反演、杜教篩),更加靈活,也沒有什麼定式套路。
不少時候其實能夠直接當作一個dp的模型。
這個模型能夠解決不少關於質因子貢獻的問題。
它的適用條件:spa

  • \(f(p)\)能夠表示爲簡單多項式
  • \(f(p^k)\) 能夠快速求。

第一個條件還蠻嚴苛的。
min_25篩的思想感受仍是很是有用:篩出質數的\(f\) =====> 篩出全部數的\(f\)
其中篩質數時,用總答案減去不合法 ; 篩全部數的時候,直接正向計算全部的答案。排序

step2. 篩質數的答案

min_25篩分兩步走,首先對於全部\(N = \lfloor \frac{n}{x} \rfloor\) 篩出\(\sum_{i=1}^N [i\in P] f(i)\)
把小於等於根號\(n\)的質數篩出來構成\(P\)集合。
又由於\(f(p)\)能夠表示爲簡單多項式,因此:
\[\sum_{i=1}^N [i\in P] f(i) = \sum_{i=1}^N [i\in P] \sum_{k=0}^{\inf} coef_k i^k = \sum_{k=0}^{\inf} coef_k \sum_{i=1}^N [i\in P] i^k\]
因此咱們要求的東西實際上是\(\sum_{i=1}^n [i\in P] i^k\)
這個東西怎麼求網上博客都寫的很清楚了,設\(g(n,j) = \sum_{i=1}^n [i\in P \ or\ p_{min}(i) > p_j] f(i)\)
而後按照\(j\)分層處理,獲得:
\[g(n,j) = g(n,j-1) - p_j^k (g(\lfloor\frac{n}{p_j}\rfloor , j-1) - g(p_{j-1},j-1))\]
其中\(p_j^2 \leq n\)
顯然,由於咱們把全部數的\(f\)都當成質數的方法來算,因此只有\(g(n,P)\)是真的,其餘\(g\)都是假的。
不過沒有關係,反正後面的篩法中也只須要用到\(g(n,P)\)
可是咱們也能夠利用這些假的\(g\)來搞事情。
這個過程若是深刻來看是什麼呢?就是那個醜的不行的O(ln)埃式篩
\(j\)次操做後,剩餘集合的\(f\)之和就是\(g(n,j)\)
這個過程是怎麼實現的呢?觀察上式右半部分,
咱們每次計算了最小質因子等於當前枚舉因子\(p_j\)的函數值之和,而後把它去掉。
這能夠看做 用最小質因子\(p_j\)標記了這些合數,注意是合數!
因此若是須要求一些關於最小質因子的東西的合數前綴和時,咱們就能夠在這裏作手腳了。博客

光說不作假把式,求\(\sum_{i=1}^n [i\not\in P]r(p_{min}(i))i\),其中\(r(x)\)爲一個關於\(x\)的函數。
咋作?
咱們直接篩\(\sum_{i=1}^n [i\in P]i\)這個東西,但光篩這個是不行的,由於還要加上\(r(p_{min}(i))\)的貢獻。
注意到咱們每次刪去合數的答案時,咱們是用最小質因子\(p_{min}(i)\)標記的。
因此每一層\(j\)中,
\(h(j) = p_j (g(\lfloor\frac{n}{p_j}\rfloor , j-1) - g(p_{j-1},j-1))\)不就是以\(p_j\)爲最小質因子的合數除掉\(p_j\)後的和嗎?
當計算\(g(n,j)\)的時候,在每一層直接加上\(r(p_j)h(j)\)便可。io

若是是求質數前綴和的話......
這個東西本來的做用不就是篩質數的函數值嗎?
若是是求全部數前綴和的話......
喂喂喂,把質數的加上合數的不就是全部數了嗎?
還有邊界問題,\(g(n,0) = \sum_{i=2}^n i^k\),經典問題人人都會,差分或插值弄一下就好了。
這部分的複雜度是\(O(\frac{n^{\frac{3}{4}}}{logn})\),緣由未知。模板

step3. 篩全部數的答案

對於後半部分,
\(S(n,j) = \sum_{i=1}^n [p_{min}(i) \geq p_j] f(i)\),等於把\(i\in P\)的條件刪掉。
推導什麼的咕咕咕網上都有。class

  • 質數部分答案:\(g(n,P) - \sum_{k=1}^{j-1} f(p_k)\)
  • 合數部分答案:\(\sum_{k=j}^{|P|} \sum_{e=1}^{p_k^{e+1}\leq n} [f(p_k^e) S(\lfloor \frac{n}{p_k^e} \rfloor ,k+1) + f(p_k^{e+1})]\)

最後那個尾巴\(f(p_k^{e+1})\)是由於形如\(f(p^k)\)的函數值在計算中被咕咕咕了因此要補上。
這個過程能夠發現一個很是有意思的事情。
對於任意一個數\(n\),咱們計算到它步驟是:質因子從小往大枚舉因此:原理

  • \(1.p_{j-1}\)必定是當前數所包含的上一個質因子。
  • 2.它最大的一個質因子必定是最後枚舉到的部分。

因此若是咱們求一些與最大/次大質因子有關的東西的前綴和時,咱們就能夠在這上面作手腳了。
先看求最大質因子特殊貢獻。
此時須要知足一個條件:質數的後綴貢獻好求。
在求解\(S\)的過程當中,咱們能夠強制當前這一層可選的\(p_j...p_{|P|}\)爲最大質因子
這樣就能夠在算質數部分答案的時候,直接把最大質因子\(r(p_{max}(i))\)的貢獻直接加上了。
固然前提是這個後綴貢獻好加(說句實話不少時侯這個條件都不知足)。
而後咱們就處理了形如\(n = w * p_{max}\)的數的貢獻添加。
若這個數\(n = w * p_{max}^k,k>1\),咱們在質數答案部分是沒法添加貢獻的。
然而若是明白了min_25篩原理就能夠發現,其實只須要在那個尾巴\(f(p_{k}^{e+1})\)處加上貢獻就好了。
而後若是是處理次大質因子特殊貢獻的話,其實還更好求了。
根據上述,咱們知道在\(S(n,j)\)這個狀態時,咱們上一層選擇的質因子必定是\(p_{j-1}\)
因此相似的強制當前層選擇的\(p\)爲最大質因子,而後使用\(p_{j-1}\)在當前層作特殊貢獻。
固然注意要特判這個數形如\(w*p_{max}^k,k>1\)的狀況,此時在那個尾巴出處理一下便可。
還能幹其它的嗎?
能夠。
注意到對於一個數,咱們在每一層枚舉的是一個本質不一樣的質因子。
因此咱們還能夠處理與特定質因子有關的前綴和計算。
固然注意時刻要記得質數的部分特殊處理,因此篩\(g\)的時候也要特殊處理一下特定質因子。
即那些特殊質因子在\(g\)中的貢獻也得是它們特殊形式的貢獻。
處理\(g\)中的特殊質因子能夠按照如下步驟:gc

  • 把特殊質因子所有拿出來排序,求它們本來形式的\(f\)、特殊形式的\(f'\)的前綴和。
  • 按照通常方法把\(g\)給求出來。
  • 對於每一個\(g\),二分獲得其包含的特殊質因子範圍,用前綴和把原來答案減掉,新答案加上。

光說不練假把式。方法

例:求\(\sum_{i=1}^n [gcd(i,K)=1]\mu(i)\) , 其中\(n\leq 10^{10}\)

說實話若是不是學了min_25篩,我這輩子都不會以爲這玩意能求。
知道了上面的套路後,這個東西就變得很簡單了,
原式即\(\sum_{i=1}^n \mu(i)\)減去包含某些特定質因子的數的貢獻,直接在min_25篩的後半部分判一下就好了。
簡單吧......

這部分的複雜度是\(O(\frac{n}{poly(logn)})\),緣由一樣未知。

總結

min_25篩除了能夠篩積性函數前綴和外,還有許多其餘應用。
min_25篩在處理與數的因子有關的前綴和計算時,有奇效,很是的好用。
常見模型都包含在上文中了:

  • 篩某積性函數前綴和 (標準形式模板題)
  • 處理"最小質因子特殊貢獻"前綴和 (第一部分求\(g\)變形)
  • 處理"最大值因子/次大質因子特殊貢獻"前綴和。 (第二部分求\(S\)變形)
  • 處理"特定質因子特殊貢獻"前綴和。 (第一部分求\(g\)特殊處理,第二部分求\(S\)變形)

這玩意兒這麼靈活感受能夠放肆出題啊.......早晚要完......瑟瑟發抖...... 就醬(QwQ)。

相關文章
相關標籤/搜索