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 精髓在於...