1. 程式人生 > 其它 >Min_25 Sieve 學習筆記

Min_25 Sieve 學習筆記

這個東西不是人想的。

解決問題:積性函式字首和。

適用條件:可以快速計算 \(f(p)\) 的字首和,\(f(p^k)\) 可以被表示成若干完全積性函式的線性組合(指對應項可以快速組合出來)。

時空複雜度:就當是 \(O(\dfrac{n^\frac{3}{4}}{\log n}+n^{1-\epsilon})-O(\sqrt n)\)

以下預設 \(f(p)\) 為關於 \(p\) 的單項式,\(p_i\) 為第 \(i\) 個質數。

求質數處的字首和

我們需要對於每個能被表示成 $\lfloor \dfrac{n}{x}\rfloor $ 的數,求所有在其前的質數 \(p\)\(\sum f(p)\)

。注意到一個數的最小質因子小等於 \(\sqrt n\),我們設計一個 dp:\(g_{i,j}\) 表示最小質因子大於 \(p_i\)\([1,j]\) 的所有數的 \(f\) 之和。轉移時把最小質因子為 的 \(p_i\) 數的 \(f\) 全部刪去,即得轉移,注意容斥掉前面的質數的貢獻:

\[g_{i,j} = g_{i-1,j} - f(p_i)\big{(}g_{i-1,j/p_i} - \sum_{k\le i}f(p_k)\big{)} \]

這就體現出完全積性的重要性。求和號部分可以線上篩質數的時候預處理出來。第一維顯然可以滾動陣列優化掉,而對於第二維,$\lfloor \dfrac{n}{x}\rfloor $ 只有 \(O(\sqrt n)\)

個,預處理出來,大於 \(\sqrt n\) 的編號為 \(n/\sqrt n\) 即可。

我們把篩去所有最小質因子後的得到的 dp 陣列記為 \(g\)

求原函式字首和

\(s_{n,i}\) 表示 \([1,n]\) 最小質因子大於 \(p_i\) 的所有數的 \(f\) 之和。列舉最小質因子及其次數,得到轉移

\[s_{n,i} = g_n - \sum_{j\le i}f(p_j) + \sum\limits_{p_k^t \le n} f(p_k^t)\bigg{(}s_{n/p_k^t},k+1)+[t\gt 1]\bigg{)} \]

根據神奇的複雜度分析,可以直接遞迴下去做。

最後加上 \(1\) 的貢獻。