1#define ll long long
2const
int maxn = 1000000;3
intvis[maxn],prime[maxn];
4void
isprime()516
}17 }
判斷模板
1bool prime(intx)2
15return
flag;
16 }
1 #include2 #include3 #include4using
namespace
std;
5#define n 10000000567
bool
vis[n];
8int
p[n], cnt, phi[n];910
int euler(int
n)18
for (j = 0; j < cnt && i * p[j] < n; ++j)25}
26}27return
cnt;28}
2930
int eratosthenes (int
n)40}41
return
cnt;42}
4344
intmain()
64return0;
65 }
我們先來看一下最經典的埃拉特斯特尼篩法。時間複雜度為o(n loglog n)
1intans[maxn];
2void prime(intn)3
15}16return
;17 }
顯然,當乙個數是素數的時候,那麼他的倍數肯定是合數,篩選標記即可。從i*i而不從i*2開始,是因為已經i*3,i*2早已經被2,3篩過了。
由此,我們也可以發現有的合數被重複篩除,例如30,2*15篩了一次,5*6重複篩除,所以也就有了我們下面要提到的尤拉線性篩法。
不會重複篩除,是線性o(n)的複雜度。
1const
int maxn=3000001;2
int prime[maxn];//
儲存素數
3bool vis[maxn];//
初始化
4void prime(intn)5
18}19return cnt;//
返回小於n的素數的個數
20 }
1void
prime()
7for(int j = 0; j < num && i*b[j] < maxn; j++)11}
12 }
只有不斷學習才能進步!
素數判斷及篩法
單個素數判斷 素數判斷 小資料 int prime int n miller rabin 大素數判定 單個數字n複雜度15 log n int mr 30 此陣列為測試用的a,這12個可測所有的long long int lli miller rabin lli n if x 1 return fa...
素數判斷及篩法
素數 prime number 又稱質數,有無限個。素數定義為在大於1的自然數中,除了1和它本身以外不再有其他因數。問法1 給定乙個數n,判斷n是不是素數 一 暴力列舉 列舉2 n 1分別當做除數,判斷是否能整除,如果某個數能把n整除,那麼就說明n不是素數,如果所有都不能整除,那麼n就是素數。注 n...
數論 多種素數判斷法及素數篩法
水了一篇啊.眾所周知,大於等於 2 的僅含有 1 和自身這兩個因子的正整數被稱作素數 故只要判斷在 2,n 1 範圍內是否存在其它因子,就可以判斷 n 是否為素數了 無腦判斷法直接從 2 for到 n 1 稍微優化下可以縮減到 2,frac n 2 但這個方法時間複雜度為 o n 可以發現,如果某個...