[學習筆記]min_25篩


神佬yyb

神佬zsy

想不到花了兩個小時的時間看 \(min\_25\) 篩就看懂了 實際去追了一下魔禁3

我們先舉個例子。如求

\[\sum_{i=1}^{n}f(i) \]

其中 \(f(i)\) 是積性函數,而且要滿足 \(i\in prime\)\(f(i)\) 是一個簡單多項式,\(f(i^k)\) 可以快速計算出來。

怎么用呢

我們先丟開前綴和,計算

\[\sum_{i=1}^{n}[i\in prime]f(i) \]

那么現在我們要用到埃氏篩的思想。每次我們要減去新篩去的 \(f(i)\),然后減完了以后就是答案

\(g(n,j)\) 表示在前 \(j\) 個質數用埃氏篩篩完后的答案。

舉個例子,\(g(10,2)=f(2)+f(3)+f(5)+f(7)+f(9)\)。令 \(P_j\) 為質數集合中第 \(j\) 小的質數,那么

\[g(n,j)=\sum_{i=1}^{n}[i\not |\ P_1,[i\not |\ P_2,...,[i\not |\ P_j]f(i) \]

現在,我們可以用 \(g(n,j-1)\) 來推出 \(g(n,j)\)

\(P_j^2>n\),那么 \(P_j\) 便對答案沒有貢獻了,\(g(n,j)=g(n,j-1)\)

\(P_j^2\leq n\),那么我們在 \(g(n,j-1)\) 的基礎上要減掉一些東西。

那減掉什么呢?

首先,能被 \(P_j\) 篩掉的數一定被 \(P_j\) 整除,並且在除以 \(P_j\) 之后,最小質因子 \(\geq P_j\)

那么我們聯想到了 \(g(\frac{n}{P_j},j-1)\)。但是發現 \(P_j\times P_1,P_j\times P_2,...,P_j\times P_{j-1}\) 已經被篩過了,所以要減去的應該是 \(f(P_j)\times (g(\frac{n}{P_j},j-1)-\sum_{i=1}^{j-1}f(P_i))\)

所以可以得到下面的式子:

\(g(n,j)= \begin{cases} g(n,j-1)&P_j^2>n\\ g(n,j-1)-f(P_j)\times [g(\frac{n}{P_j},j-1)-\sum_{i=1}^{j-1}f(P_i)]&P_j^2\leq n \end{cases}\)

這就是 \(min\_25\) 篩的精髓。其實本質上 \(min\_25\) 是個容斥算法。

值得一提的是,它的時間復雜度為 \(O(\frac{n^{\frac 34}}{\log n})\),可以當做 \(O(n^{\frac 23})\),在 \(n\leq 10^{11}\) 的數據下大概要花 \(500ms\) 左右。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM