很多常用的數論函式都是積性函式,而在題目中,我們常常需要線性(甚至更高)的篩法。
對於積性函式,我們可以在篩素數的基礎上稍加修改,即可完成線性篩。
首先,注意到積性函式的特點:
\[f(xy)=f(x)\times f(y)
\]而可以線性篩的積性函式,需要知道以下兩個式子的快速求法:
\[f(p)=?\quad f(p^k)=?\\p\in prime
\]其中, \(f(p)\) 大多是直接定義,\(f(p^k)\) 大多是遞迴定義。
我們來回憶一下素數篩的過程:
inp[0]=inp[1]=1;
for(int i=2;i<=n;i++)
for(int j=1;j<=tot && i*prime[j]<=n;j++)
}}
首先,對於判定的質數 \(p\) ,可以直接給出定義的值。
之後,對於 \(i\%p\neq0\) ,由於 \(i\) 和 \(p\) 互質,可以直接用積性函式性質推得。
然後,對於 \(i\%p == 0\) :
那麼**如下:
inp[0]=inp[1]=1;
f[1]=1;
for(int i=2;i<=n;i++)
for(int j=1;j<=tot && i*prime[j]<=n;j++)
f[tp]=f[i]*f[prime[j]];
low[tp]=prime[j];
}}
缺點很明顯,比較耗空間。(但是題目會給夠的
當需要線性篩很多個積性函式時,可以同時進行。
這種基於素數篩的線性篩法,有時不止對積性函式有用,對於一些和素數有關的函式也可以篩出,具體在我寫的莫比烏斯反演中有例子。
-eof-
線性篩法與積性函式
尤拉函式 1.varphi p p 1 證明 顯然 2.varphi i p p varphi i if space i bmod p 0 引理1 varphi p a p 1 p 證明 比 p a 小的數一共有 p a 1 個,其中與 p a 不互質的且小於 p a 的 即 p 的倍數 p t 一...
線性篩篩積性函式
概念 定義域為正整數的函式是數論函式。設p,q互質,f p q f p f q 稱f為積性函式。如約數,尤拉,莫比烏斯。任意p,q,f p q f p f q 稱f為完全積性函式。如1函式,即f i 1。我們一般用線性篩就可以預處理積性函式。尤拉phi void phii for int j 1 j...
積性函式線性篩
oi中有時需要我們線性篩某些函式,我們篩的主要是積性函式 1st 線性篩素數 include includeusing namespace std const int maxn 1e4 5 int n,prime maxn vis maxn tot void get prime int n int ...