素數 篩 理解

2022-07-24 17:48:20 字數 1015 閱讀 8486

埃拉託斯特尼篩法的時間複雜度是o(n*lglgn)

bool vis[maxn];//

能否被 素數合成

//int prime[maxn], cnt = 0;

void prime(int

num)

}}

線性篩 接近o(n)

bool vis[maxn];//

能否被 素數合成

int prime[maxn], cnt = 0

;void prime(int

num)

}}

附帶的是 偶數字數的回文 必定是 11 的倍數 ( 除了11 都是合數 ), 先證 乙個數奇偶位和 的差 是11的倍數,則這個數為11的倍數

證: dn dn-1 dn-2 ... d3 d2 d1

每一位的貢獻 為 dn * 10^(n-1)

要想這一位的貢獻是11的倍數 則加上 dn * 10^(n-2)

那麼原本 10^(n-2) 的貢獻從 dn-1 * 10 (n-2) 變為了 (dn-1 - dn) * 10^(n-2)

再進行上兩行步驟 10^(n-3) 的貢獻變為了 (dn-2 - (dn-1 - dn) ) * 10^(n-3) = (dn-2 - dn-1 + dn) * 10^(n-3)

遞推得到 最後一項 應該為 +- (dn - dn-1 + dn-2 ... d3 - d2 + d1)* 10^0 要想使得這個數字是11的倍數那麼只要令 (dn - dn-1 + dn-2 ... d3 - d2 + d1)= 0

所以設乙個偶數字的回文數 sn sn-1 sn-2 sn-3 ... s3 s2 s1 s1 s2 s3 ... sn-3 sn-2 sn-1 sn

每間隔乙個數字取走求和, 在經過對稱點s1 下一步會變成s2 然後 下標+2, 由對稱性得 從s2 開始也是一樣, 所以奇數字的 等於 偶數字的和 等於 s1 + s2 + s3 +... sn

所以偶數字的回文數 為 11 的倍數

//挺閒的

線性篩理解及應用

目錄 如何求出1 n的素數個數呢 我們只要將素數的倍數全部篩掉就可以 埃氏篩 int isprime int n return cnt 埃氏篩法會將合數重複地篩掉,如有可以只篩一次合數,那麼複雜度就會降到o n 線性篩 尤拉篩 就是通過合數最小的質因子篩掉這個合數 int isprime int n...

個人對素數的理解

首先,對於乙個求100 200之間的素數,最初始的 應該是這樣的 include intmain if i j 到這裡有兩種可能,一種break跳出來的,不是素數 另一種是素數,即i和j相等 return0 優化,就是讓計算機更輕鬆,讓計算機使用更少的資源解決問題 因為素數肯定是奇數,所以素數不能被...

深入理解線性質數 素數 篩

int p n cnt p n 用來存質數,cnt表示質數的個數 bool st n 表示當前的數有沒有被篩過樸素篩法 o n logn o nlogn o nlog n void get primes int n 由於當執行到 i 時可以確保已經用小於 i 的每乙個質數都篩過一遍,因此可以保證每乙...