尤拉函式線性篩(模板)

2021-08-19 02:03:25 字數 1011 閱讀 1609

關於尤拉函式篩法,之前一直用的o(n ^2)演算法

phi[1] = 1;//邊打表邊篩選  

for(int i = 2; i < 1005; i ++)phi[i] = i;

for(int i = 2; i < 1005; i ++)

if(phi[i] == i)

for(int j = i; j < 1005; j += i)

phi[j] = phi[j] / i * (i - 1);

其實如果資料小的話這樣也挺快

可是如果資料一大它就不太行了,相比之下,另乙個尤拉函式線性篩法時間複雜度明顯低於o(n^2),接近於o(n),故稱之為線性篩

關於其實現方式有三條定理需要注意:

1.  phi(p) == p-1 因為素數p除了1以外的因子只有p,所以與 p 互素的個數是 p - 1個

2 . 如果i 與 p 互質, 那麼 phi(i * p) == phi(i) * (p-1)

3. 如果i 與 p 不互質, 那麼 phi(i * p) == p * phi(i)

關於三條定理的證明網上很多也很簡單在這裡不贅述

模板:

#include#include#define n 40000    

using namespace std;

int n;

int phi[n+10],prime[n+10],tot,ans;

bool mark[n+10];

void getphi()

for(j=1;j<=tot;j++)

else phi[i*prime[j]]=phi[i]*(prime[j]-1);//其實這裡prime[j]-1就是phi[prime[j]],利用了尤拉函式的積性

}

}

}

int main()

尤拉函式線性篩模板

此模板主要用來求1 n n 1e6 以內的尤拉函式,順帶把素數也篩了出來.尤拉函式表示n以內與n互素的數,其中phi 1 1。這裡主要利用了尤拉函式的兩個性質 1.若p是x的因子,則e p x p e x 證明直接利用算數基本定理就行了。2.若p是素數,且x與p互素,即x,p都為素數 則e p x ...

線性篩尤拉函式

在數論,對正整數n,尤拉函式是小於n的正整數中與n互質的數的數目,用 varphi n 表示。其中 p 1,p 2 p n 為 x 的所有質因數,x 是不為0的整數。varphi 1 1 當正整數p為質數時 varphi n n 1 尤拉函式是積性函式,當a與b互質時,滿足 varphi a tim...

模板 線性篩素數 尤拉篩法

o n 處理出n以內所有素數 使用 合數 最大因數 除1和本身外 最小質因數 的原理來篩,每個數隻會被篩一次 對於每個數i,令它是某數的最大因數,然後從小到大地找 i的素數j,則i j是合數 直到找到某個j使得 i j 0 因為再往後的話,j i的某個因子,我們能交換j 和i的這個因子,所以i不是i...