東北林業大學acm大一培訓(素數篩)

2021-10-07 15:06:43 字數 3861 閱讀 3798

1.不知名篩選 篩法的思想是去除要求範圍內所有的合數,剩下的就是素數

了,而任何合數都可以表示為素數的乘積,因此如果已知一

個數為素數,則它的倍數都為合數。

2.埃氏篩 合數的倍數一定會在篩素數倍數時候被篩掉,所以只篩素數就好,只把質數的素

數篩掉 就是找到乙個質數,把它的倍數全部標記為合數。但是你會發現有的數

字會被標記多次,比如 12 被 2 ,3 ,都標記,這樣會浪費時間。

3.線性篩 素數篩可 以優化,普通的線性篩法雖然大大縮短了求素數的時間,

但是實際上還是做了許多重複運算,比如23=6,在素數2的時候篩選了一遍,

在素數為3時又篩選了一遍。如果只篩選小於等於素數i的素數與i的乘積,

既不會造成重複篩選,又不會遺漏。時間複雜度幾乎是線性的

1.我們要篩1~n中的素數,然後先預設他們都是素數,最外層列舉

1~n的所有數,

2.如果它是素數,就加到素數表,

3.對於每乙個列舉的i ,列舉素數表裡的數,然後素數就會標記自己 i

倍的數不是素數,(素數的倍數不是素數)

4.列舉素數表什麼時候停?列舉到i的最小質因子,標記完就可以停

了,保證每個數隻被他的最小質因子篩掉。

例如:外層i=15時,素數表裡:2,3,5,7,11,13

215=30,把30篩掉;3*15=45,把45篩掉,因為15%3==0,退

出裡面的迴圈;

15是被3篩掉的,因為3是15的最小素因子。

sqrt 判別 o( (√n) )

如果x可以表示為兩個因子相乘

x=ab 假設a<=b

那麼x>=aa

a<=√x

只需要列舉a<=√x就可以了

求因子和

一 個 數 a 能 夠 表 示 成 多 個 素 數 的 冪 相 乘 的 形 式 。 即a=(a1n1)*(a2n2)(a3n3)…(amnm)。那麼a的因子和就

是 : (1+a1+a12+…a1n1)(1+a2+a22+…a2n2)*(1+a3+a3^2

+…a3n2)*…(1+am+am2+…am^nm)

2.如果我們把括號拆開看的話,就很容易看出來拆開實際就是

各個因子相加 比如12的因子和=(1+2+2^2)(1+3)

=1+2+4+3+6+12

判斷乙個數,是否是素數。

input

輸入資料有多組(不超過1e5組),每組1個正整數n(1<=n<=1e7)。

output

如果是素數,輸出yes;否則輸出no。

sample input

1115

19sample output

yesno

yes

#include

#include

using

namespace std;

const

int n=

1e7+1;

const

int max1=

1e7;

int prime[n]

;bool b[n]

;int i,j;

int ans=0;

intinit()

}}intmain()

return0;

}

宋朝的女子嫁人時,要考察男子的滿意度(滿意度=財富值+地位值-婆婆的暴力值)

如果滿意度是素數的話,就可以嫁,否則就不答應這門婚事。

input

第一行是n(1<=n<=50),表示資料的組數;

接下來是n行,每行3個正整數x,y,z(財富值,地位值,暴力值);(1<=x,y,z<=1e14)

output

如果可以同意這門婚事,輸出"yes";

否則輸出"no";

sample input

210 2 1

10 2 2

sample output

yesno

#include

#include

using

namespace std;

const

int n=

1e7+1;

int prime[n]

;int b[n]

;int i,j;

int ans=

0,max1=

1e7;

intinit()

}return0;

}int

fun(

long

long n)}if

(n==

1) flag=1;

return flag;

}int

main()

return0;

}

給定乙個範圍 n,有 q 個詢問,每次輸出第 k 小的素數。(2<=n<=4e7,1<=q<=1e4)

input

第一行包含兩個正整數 n,q,分別表示查詢的範圍和查詢的個數。

接下來 q 行每行乙個正整數 k,表示查詢第 k 小的素數。

output

輸出 q 行,每行乙個正整數表示答案。

sample input

100 512

345sample output23

5711

#include

#include

#define max1 40000001

using

namespace std;

int prime[

10000000];

bool b[max1]

;int i,j,n,m;

void

init

(int are)}}

intmain()

return0;

}

close

李華再次發現有一種素數很奇特,它依次去掉最高位,剩下的仍為素數,例如:1223,3137等數。後來李華查閱資料知道這樣的數叫純素數。

現在給你乙個整數能判斷它是不是純素數呢?

input

測試資料有多組(不超過1e5組),每組只有乙個整數n(1<=n<=1e6)

output

對於每組資料,若n為純素數,輸出yes,否則輸出no

sample input

2107

13903

sample output

yesyes

no

#include

#include

#include

using

namespace std;

const

int maxl=

1e7+1;

const

int maxx=

1e7;

bool isprime[maxl]

;int prime[maxl]

;int n,x,m;

intinit()

}return0;

}boolss(

int x)

for(

int i=

1;i<=len;i++

)return1;

}int

main()

return0;

}

東北林業大學acm大一培訓(六)(佇列)

佇列就是允許在一端進行插入,在另一端進行刪除的線性表。允許插入的一端稱為隊尾,通常用乙個隊尾指標r,r指向隊尾元素,即r r總是指向最後被插入的元素 允許刪除的一端稱為隊首,通常也用乙個隊首指標f,f指向排頭元素的前面。初始時 f r 0 1 初始化佇列 queuevis 定義乙個佇列 2 入隊 v...

東北林業大學OJ題目1

百步穿楊 problem 796 time limit 1000ms memory limit 65536k description 時維九月,序屬三秋,遼軍大舉進攻帽兒山,戰場上兩軍正交鋒.遼軍統帥是名噪一時的耶律洪豬,而帽兒山方則是派出了傳統武將 松樹葉子。雙方經過協商,約定在十一月八日正午十分...

東北林業大學oj1025 又是指標

現在有的程式根本用不上指標 但由於學c 不得不用指標這個讓我苦笑不得的東西 這道題 就是乙個例子 本來 簡簡單單的字串查詢 變成指標 o my god!題就是下面的 程式完成在一些已知字串中查詢含有 最多的字串的功能。要求用返回指標值的函式完成 找到這個字串,函式返回 最多的字串的首位址,若所有字串...