張博航原知乎網址html
張博航原博客網址算法
引入:數組
給一個徹底積性函數$f$,求其前綴和函數
$$S(n)=\sum_{i=1}^nf(i)$$spa
初步思考:設計
考慮因爲所求函數爲徹底積性函數,咱們很容易用一個線性篩在$O(n)$的時間負責度內解決問題。htm
可是每每這類問題要求更加優秀的時間負責度,那麼線篩便不能知足咱們的須要,咱們須要更加優秀的作法。blog
咱們考慮一種最基礎的篩法:埃拉託斯特尼篩法。ip
在這種篩法的思路中,咱們只須要枚舉$\sqrt n$之內的質數,那麼咱們是否能夠引入這種想法呢?get
進一步思考:
咱們考慮將$S(n)=\sum_{i=1}^n f(i)$換成與質數有關的表達形式。
咱們設$\tau(x) = x的最大質因子$。
那麼
$$S(n) = \sum _{i=2}^n\sum_{\tau(i)<p,i*p<=n}f(ip) + \sum_{i=2}^nf(i)[\tau^2(i)|i] + f(1) + \sum_{p=2}^n f(p)$$
$$\because \forall a,b\; f(ab)=f(a)f(b)$$
$$\therefore S(n)=\sum_{i=2}^nf(i)\sum_{\tau(i)<p,ip<=n,p==\tau (p)}f(p)+\sum_{i=2}^nf(i)[\tau^2(i)|i]+f(1)+\sum_{p=2}^nf(p)$$
咱們來看這個式子。
咱們發現前兩部分枚舉的$i$所含質數$p$必然$p<=\sqrt n$。
那麼咱們使用DFS來枚舉這些$i$會發現枚舉量爲:$$n-\sum_{i=\sqrt n+1,i=\tau(i)}^n \lfloor \frac{n}{i} \rfloor$$
這個式子我並不會算……
可是經過張博航的博客,這個式子的結果是約等爲$\frac{n^{\frac{3}{4}}}{ln n}$存在必定的常數。
思考算法設計:
那麼問題就變成了如何去求$\sum_{\tau(i)<p,ip<=n}f(p)$以及$\sum_{p=2,p=\tau(p)}f(p)$。
咱們發現後者實際上是能夠看做於前者是一類的。
那麼設$S'(n)=\sum_{p=2,p=\tau(p)}f(p)$,即上式爲$S'(\frac{n}{i})-S'(\tau(i))$來表示的。
因爲除法分塊咱們能夠知道$\lfloor \frac{n}{i} \rfloor$取值僅有$\sqrt n$級別個,同時$\tau(i) <=\sqrt n$。
那麼咱們設$$a_i = S'(i),b_i=S'(\frac{n}{i}),i\leqslant \sqrt n$$
那麼考慮如何求出$S'$。
咱們先將全部數都看作質數,那麼此後咱們從小到大枚舉一個每一個小於$\sqrt n$的質數$p$,那麼
$$S'(i)=S'(i)-f(p)(S'(\frac{i}{p})-S'(p-1))$$
考慮用數學概括法證實:
首先當$p==2$時,此式顯然獲得的是去掉全部含「2」因子的合數。
那麼設此式在以前質數中都是正確的,此時枚舉到了$p$。同時設$\zeta i = i的最小質因數$
那麼咱們考慮此時
$S'(x)=\sum_{i=2,i=\tau(p),i<p}f(p) + \sum_{i=p}^x [\zeta(i)>=p]f(i)$
那麼
$f(p)(S'(\frac{i}{p})-S'(p-1) )= \sum_{j=p}^{\frac{i}{p}} [\zeta(i)>=p] f(i*p)$
即此時咱們給$S'(i)$刪去了所含質因數均大於等於$p$的合數。故上式當處理到$\sqrt n$時是正確的。
咱們再考慮如何求出$a,b$數組。
顯然咱們要從小到大枚舉每一個質數,再從大到小枚舉每個有用的$i$。而後考慮:
1) 若$i>\sqrt n$那麼其對應位置必定在$b$數組出現過。
2) 若$\frac{i}{p}>sqrt n$那麼其對應位置也必然在$b$中出現,這是因爲$i$是由$\frac {n} {j}$獲得的。
那麼$\frac{i}{p}$就等價於$\lfloor \frac{ \frac{n}{j} }{p} \rfloor= \frac {n} {jp}$顯然$jp<=\sqrt n$ 那麼其此時$\frac{i}{p}$必定在b中出現過。
3) 若$i<=\sqrt n$ 那麼其必然出如今$a$中,$\frac{i}{p}$同理。
也就是說對於用每一個$p$來更新$a,b$須要且僅須要$a,b$數組。
考慮求$a,b$的時間複雜度約爲:
$ \sum_{i=2,i=\tau i} (2\sqrt n - i^2) $。
這個東西,應該約爲$\frac {2n^\frac{3}{4}} {3ln(\sqrt n)}$。考慮枚舉第一部分$i$具備常數。這兩部分應該是很接近的。
算法使用範圍:
假設咱們能夠將一個函數寫成關於$p$的$k$階多項式形式的話,咱們就能夠利用上面描述的篩法,在$k\frac{n^\frac{3}{4}}{lnn}$時間內獲得答案。
======update======
這個彷佛和min_25篩很像?