特別基礎的數論

2022-06-25 23:39:18 字數 1162 閱讀 3680

本文主要講了線性篩素數、分解質因數演算法。

p3383 【模板】線性篩素數

這裡只講尤拉篩

演算法思路:若是列舉到乙個數\(x\),如果它沒被標記成合數,那麼加入素數陣列,同時再用乙個迴圈把所有小於x最小質因子的質數乘以x的數標記成合數。這樣是有線性複雜度的。

既然是線性的正確演算法,那應該能保證沒漏篩、沒重複篩。

證明:設合數 \(\) 有兩個質因子 \(=b\times\dfrac\)

可以得到 \(\dfrac<\dfrac。

那麼我們就可以用 \(s\) 最小的質因子來篩掉 \(s\),就只會篩一次。

不妨設 \(a\) 就是最小的質因子,那麼 \(\dfrac\) 的最小的質因子一定大於等於 \(a\),那麼尤拉篩就一定在列舉到 \(\dfrac\) 能篩掉 \(s\)。

但是在列舉到 \(\dfrac\) 時,因為它的最小的質因子一定大於 \(a\),那麼尤拉篩就不會篩到 \(s\)。

綜上所述,\(s\) 當且僅當列舉到 \(\dfrac\) 時會被篩,所以就不會重複篩也不會漏篩。

**:

#include using namespace std;

const int maxn=1e8+100;

bool isp[maxn];

int prime[maxn>>4],pcnt;

void init(int n) }}

int main()

return 0;

}

這個可以做到\(o(\sqrt)\)將\(n\)分解

可以發現,大於\(\sqrt\)的質因數最多有乙個,且指數一定為\(1\)。

不然它們乘起來就大過\(n\)了,所以我們可以只列舉\(\leq n\)的質因數。

先放**

#includeusing namespace std;

const int maxn=40;

int p[maxn],c[maxn],pcnt,n;

void work(int n)

}//由於比這個因子更小的質因子都被除掉了

//所以這個因數一定是質因數

} if(n>1)

}int main()

return 0;

}

數論基礎題

十多天沒寫題了,來兩道基礎題練練手 全部51nod上面的 1240 莫比烏斯函式 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 莫比烏斯函式,由德國數學家和天文學家莫比烏斯提出。梅滕斯 mertens 首先使用 n miu n 作為莫比烏斯函式的記號。據說,高斯 gau...

筆記 基礎數論

當 a,p in mathbb 且 p 為質數,且 a not equiv 0 pmod 時有 a equiv 1 pmod 所以 a b equiv a pmod p 當 a,m in mathbb 且 gcd a,m 1 時有 a equiv 1 pmod 這裡 varphi x 是數論中的尤拉...

數論基礎之質數

文章是看了好多好多大佬的部落格才自己總結出來的,有些地方覺得大佬的文字很精煉於是學習了一下,若是有人認為哪些地方我是不道德的,請指出,謝謝。質數,也稱素數,只包含兩個因數,且乙個因數為1,乙個因數為它本身。無論是數論 計算機應用上還是acm上,質數都是基礎且極其重要。於acm上,質數經常用於判斷乙個...