數論基礎 線性篩 小小講解

2022-06-20 21:00:10 字數 815 閱讀 4284

思想:

眾所周知,唯一分解定理:n= p1^c1*p2^c2*p3^c3*...*pm^cm。

於是每個合數都能用若干個素數相乘表示。而素數只有乙個素數因數。只要乙個數存在不等於自身的素數因數,就必定是合數,反之,為素數。

**思路:

我們可以將每個數(包括素數合數)向外擴充套件一次(用乙個素數×該數),只要經拓展就必定有兩個或以上的質因數,就一定是合數,用陣列記錄他最小質因數。

而向外擴充套件不能讓陣列越界,如果越界,要立即跳出迴圈。

於是我們用v記錄他們的最小因數(除去1)。最小質因數為自身的一定是質數。

而向外擴充套件的過程僅涉及不大於最小質因數,又可以避免12=4*3與12=6*2重複的現象,正好可以從大到小列舉所有質因數而不發生計算的重複,可以有效節省時間。

時間複雜度為o(n)。

**:

#include #include 

#include

#include

#include

using

namespace

std;

const

int maxn=5000000+50

;int

n,m,ans,v[maxn],cnt,p[maxn];

intmain()

v[0]=1;//

令0不是素數

while (scanf("

%d",&n)!=eof)

return0;

}

例題:

數論 線性尤拉篩

const int maxn 1e5 5 bool vis maxn ll prime maxn cnt 0 void getprime ll maxn 通常我們會採用的較為暴力的方法是巢狀入2層迴圈,也就是第一層迴圈是為了依次服務於每乙個 include include using namespa...

數論 C 線性篩素數

在c 中,篩素數是乙個非常重要演算法。我花了半天時間才明白的尤拉篩 我實在是太蒻了 最愚蠢的方法 1 include2 intmain 10 11 printf no 12 普通方法 1 include2 intmain 10 11 printf no 12 以上兩種方法其實都是判定方法,並不是篩法...

數論 線性素數篩(尤拉法)

任何合數都能表示成一系列素數的積。線性素數篩的主要思想是每個合數必有乙個最小素因子,每個合數僅被它的最小素因子篩去正好一次,所以為線性時間。比如說 12 只能被 2 篩掉,12 2 6,不能被3篩掉,12 3 4 中體現在 if i prime j 0 break prime陣列中的素數是遞增的,當...