若是想看如何篩個普通積性函數啥的,就別往下看了,下面沒有的(QwQ)。
下文中,全部的\(p\)都表明質數,\(P\)表明質數集合。
注意下文中定義的最小/最大質因子都是默認全部質因子本質不一樣。
即\(2*2*3*4*5*5\)的最小/次小質因子都是\(2\),最大/次大質因子都是\(5\)。函數
min_25篩用於求積性函數前綴和,即\(\sum_{i=1}^n f(i)\) 。
min_25篩相比於傳統篩法來講(如莫比烏斯反演、杜教篩),更加靈活,也沒有什麼定式套路。
不少時候其實能夠直接當作一個dp的模型。
這個模型能夠解決不少關於質因子貢獻的問題。
它的適用條件:spa
第一個條件還蠻嚴苛的。
min_25篩的思想感受仍是很是有用:篩出質數的\(f\) =====> 篩出全部數的\(f\)。
其中篩質數時,用總答案減去不合法 ; 篩全部數的時候,直接正向計算全部的答案。排序
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})\),緣由未知。模板
對於後半部分,
設\(S(n,j) = \sum_{i=1}^n [p_{min}(i) \geq p_j] f(i)\),等於把\(i\in P\)的條件刪掉。
推導什麼的咕咕咕網上都有。class
最後那個尾巴\(f(p_k^{e+1})\)是由於形如\(f(p^k)\)的函數值在計算中被咕咕咕了因此要補上。
這個過程能夠發現一個很是有意思的事情。
對於任意一個數\(n\),咱們計算到它步驟是:質因子從小往大枚舉因此:原理
因此若是咱們求一些與最大/次大質因子有關的東西的前綴和時,咱們就能夠在這上面作手腳了。
先看求最大質因子特殊貢獻。
此時須要知足一個條件:質數的後綴貢獻好求。
在求解\(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
光說不練假把式。方法
例:求\(\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篩在處理與數的因子有關的前綴和計算時,有奇效,很是的好用。
常見模型都包含在上文中了:
這玩意兒這麼靈活感受能夠放肆出題啊.......早晚要完......瑟瑟發抖...... 就醬(QwQ)。