1. 程式人生 > >[模板]Min_25篩

[模板]Min_25篩

用途

快速($O(\frac{n^{3/4}}{logn})$)地計算一些函式f的字首和,以及(作為中間結果的)只計算質數的字首和

一般要求f(p)是積性函式,$f(p)$是多項式的形式,且$f(p^k)$可以快速計算

做法

首先考慮求出範圍內的質數的取值的和

如果有$f(p)=\sum{a_ip^i}$

那麼我們構造$h_i(x)=x^i$,不難發現$h_i$是完全積性的

就是說,把f在質數的時候的式子拆開,然後讓它在不是質數的時候也成立

 

考慮求其中的一個h,接下來設$pri_j$是第j個質數

設$g(n,j)=\sum\limits_{i=1}^{n}[i \in Prime \&\& min_divisor(i)>pri_j]h(j)$,即n範圍內質數或者最小質因數$>pri_j$的h值之和

可以當成是埃氏篩法的過程,已經篩掉了前j個質數

那麼$g(n,inf)$就是要求的質數的和,g(n,1)就是所有數的h的和

(關於計算g(n,1),次數要是小的話可以直接帶公式,大的話就要斯特林數或者別的什麼來求自然數冪和了..不過別忘了減掉1)

考慮轉移,有:

$g(n,j)=g(n,j-1) , pri_j*pri_j>n$

$g(n,j)=g(n,j-1)-h(pri_j)(g(\lfloor\frac{n}{pri_j}\rfloor,j-1)-\sum\limits_{i=1}^{j-1}h(pri_j)) , pri_j*pri_j<=n$

考慮$pri_j*pri_j<=n$的情況,它在從$g(n,j-1)$轉移過來的時候,需要減掉那些最小質因子是$pri_j$的,而h又是完全積性的,所以可以直接乘。但這樣減會多減掉那些比$pri_j$小的質數乘$pri_j$,需要再加回來

於是我們就求出來質數的h的和啦!然而這有什麼卵用呢..