積性函式篩法

2022-06-02 02:54:10 字數 901 閱讀 4983

很多常用的數論函式都是積性函式,而在題目中,我們常常需要線性(甚至更高)的篩法。

對於積性函式,我們可以在篩素數的基礎上稍加修改,即可完成線性篩。

首先,注意到積性函式的特點:

\[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 ...