本來是在做容斥原理的題,既然碰到求a~b內與n互質的數的個數,就順便將與素數相關的知識整理一遍。
1、輸入數n,判斷是否為素數的一般方法:
#includeusing namespace std;
int main()
cout<
#includeusing namespace std;
int main()
cout<3、在學完素數篩選法
求素數後掌握了一種新方法。
算術基本定理
任何乙個大於1的
自然數n,都可以唯一分解成有限個質數的乘積
, 這裡p12
<...n>
,其中方冪 a
i是正整數。
例如180=2^2*3^2*5。
這樣的分解稱為n 的標準分解式。
算術基本定理的內容由兩部分構成:分解的存在性、分解的唯一性(即若不考慮排列的順序,正整數分解為素數乘積的方式是唯一的)。
根據上述定理,如果我們已經知道不大於正整數n的開方的素數有哪些,那麼驗證n為素數時,只需要判斷這些素數是不是n的約數,而不需要每次「+2」判斷能否被整除。特別是對於判斷多個很大的數是不是素數時比較管用,先找出sqrt(max) 範圍內的素數,然後判斷,比起對每個數每次「+2」判斷省事很多。當然,找素數時需要用到效率較高的素數篩選法(請參考:
//用素數篩選驗證素數
#includeusing namespace std;
#define n 50001
bool isprime[n];
int prime[5500];
int main()
}cin>>n;
bool bo=true;
if(n==1)bo=false;
else for (i=0;prime[i]*prime[i]<=n;i++)
}cout<
素數篩選法
篩選素數法 搞acm的都知道,素數是數論中必不可少的知識,也是必須要掌握的,關於素數的篩選有好幾種方法,下面一一道來,寫的不好還請提出。第一種是最常規的做法 int main if j sqrt i cout 這種方法肯定是比第一種快的,至於快多少大家可以比較一下,注意到裡面的for迴圈是到sqrt...
素數篩選法
素數篩選法差不多是打標,用前面確定的質數篩選掉後面的合數,然後遍歷下來所有的合數都被篩選掉了,剩下的都是素數。int vis maxn for int i 2 i n i for int j i 2 j n j i vis j 1 這是沒有優化的素數篩選法,也已經很快了,時間複雜度是n log n。...
素數篩選法
素數,是指因子只包含1和其本身的數,那麼,我們怎麼判斷素數呢?以下 均基於打表 1 1e6 的基礎上完成 素數的定義就是乙個數的因子只包含1和其本身,那麼我們直接就按照定義寫 include include define maxn 1000000 10 int pri maxn int isprim...