關於尤拉函式篩法,之前一直用的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...