素數的線性篩 尤拉函式

2022-05-17 17:33:06 字數 1178 閱讀 9524

o(n) 篩選素數

#includeusing namespace std;

const int m = 1e6 + 10 ;

int mindiv[m] ;//每個數的最小質因數

int prim[m] , pnum ;//存素數

bool vis[m] ;

void prim ()

for (int j = 0 ; j < pnum ; j ++)

}}int main ()

尤拉函式:phi[i] 為<= i 的範圍內與i互質的數的數量

尤拉埃篩,寫起來簡單,複雜度o(log(log(n)))(zstu 幻神):

#include #include #include using namespace std;

const int m = 1e6 + 10 ;

int n, m, t;

int euler[m];

void euler () }}

}int main()

尤拉線篩,寫起來複雜點,(墨跡了我半天)複雜度o(n):

#includeusing namespace std;

const int m = 1e6 + 10 ;

int prim[m] , pnum ;

bool vis[m] ;

int phi[m] ;

void euler ()

for (int j = 0 ; j < pnum ; j ++)

else phi[x] = phi[i] * phi[ prim[j] ] ;}}

}int main ()

線性尤拉跟新:

#include#includeusing namespace std;

int prime[100005],phi[1000005];

int main()

for(j=1;j<=prime[0]&&(long long)i*prime[j]<1000002;++j)

if(i%prime[j])phi[i*prime[j]]=phi[i]*(prime[j]-1);

else

}int t,n;

scanf("%d",&t);

while(t--)

}

線性篩素數(尤拉篩)

尤拉篩是o n 複雜度的篩素數演算法,1秒內埃篩能處理1e6的資料,而1e7的資料就必須用尤拉篩了。埃篩的基本思想是 素數的倍數一定是合數。尤拉篩基本思想是 任何數與素數的乘積一定是合數 演算法概述 遍歷 2,n 的所有數i,內層迴圈遍歷已經找到的素數prime j 將i prime j 標記為合數...

由素數篩法到尤拉函式(尤拉函式,線性篩)

蒟蒻最近準備狂補數學啦tat 基於篩素數,可以同時快速求出尤拉函式。於是蒟蒻準備從這裡入手,整理一下實現的思路。傳統篩素數的做法 埃式篩 是,利用已知的素數,去篩掉含有此質因子的合數,十分巧妙。由於不是本文的重點,就只貼一下 吧 include include define r register i...

素數線性篩法(尤拉篩)

之前寫的埃式篩法複雜度達o n log n lo gn o n logn logn o n lo gn l ogn 在大數字的時候可能複雜度還不夠理想。這種做法對於乙個合數有可能會篩了多次,導致重複做功。引入尤拉篩法能夠解決這種多次篩同乙個數字的情況,理論演算法複雜度o n o n o n 精髓在於...