篩法尤拉函式

2021-10-16 06:24:00 字數 1430 閱讀 7948

尤拉函式

因為對於n來說,小於等於n的正整數有n個,但是因為n是素數,n與其本身並不互質,所以有n-1個數跟它互質。

若n為質數p的k次方 那麼φ( n )=(p-1)pk

n = pk(p是質數),所以乙個數要想跟n互質的話應該不是p的倍數,p的倍數有p * p, 2 * p, 3 * p……pn-1 * p,共有pn-1個,小於等於n的正整數有pk個,所以φ( n )= (p-1)pk.

埃氏篩時間複雜度為o(n loglog n),如果乙個數的因數除了1和他本身沒有其他因數的數是素數,所以如果他是除了一和它本身的乙個數的倍數的話那麼他就是合數,所以我們就從2開始,如果這個數沒有被訪問過說明之前他沒有素數因子,所以我們就把在2到n中他的倍數給標記,如果乙個數被訪問過,說明這個數是合數,可以直接跳過了,一直找下去就好。

第二重迴圈我們在找的時候是從i*i開始的,是因為i * (比i小的數),我們之前找過了,就像2 * i, 3 * i ……所以不會被重複篩查。

#include

#include

using

namespace std;

int visited[

1000001];

intmain()

}}for(

int i=

2;i<=n;i++

)return0;

}

但是其中還有乙個需要我們注意的地方就是就像30,我們在篩查2的倍數的術後篩查過了,但是篩查5的時候同時又被篩查了一遍,為了解決這種合數被重複篩查的情況我們就有了時間複雜度是o(n)的尤拉線性篩法。

尤拉線性篩法

為此我們需要知道的一些結論:

①每乙個合數都可以分解為乙個質數與另外乙個數相乘(合數是指在大於1的整數中除了能被1和本身整除外,還能被其他數(0除外)整除的數,所以只要是合數就能夠被分解,依次遞迴分解下去);

if(i%prime[j]==0) break;

如果這個數能夠被prime整除,說明這個數可以分解為prime[j]和另外乙個大於等於prime[j]的數相乘,另外的這個數又可以分解成為若干個大於等於prime[j]的數相乘,所以如果繼續下去會導致計算判斷重複,故在此處停止,繼續向下執行,由此保證了o(n)的複雜度。

**如下:

#include

#include

using

namespace std;

int vis[

10001];

//判斷是否訪問過

int prime[

100001];

//用以儲存找到的質數

int cnt =0;

intmain()

}for

(int i=

0;i)return0;

}

AcWing 篩法求尤拉函式 篩法 尤拉函式

時 空限制 1s 64mb 給定乙個正整數n,求1 n中每個數的尤拉函式之和。共一行,包含乙個整數n。共一行,包含乙個整數,表示1 n中每個數的尤拉函式之和。1 n 10 6 題意 求1 n中每個數的尤拉函式之和。思路 在這個題目中我們不能直接分別去求1 n之間的尤拉函式,會超時,所以我們就可以根據...

篩法計算尤拉函式

先給出算單個尤拉函式的鏈結。大致方法其實和篩質數是類似的,其實,考慮到尤拉函式的定義,它和質數其實是關係甚緊的。需要用到如下性質 p為質數 1.phi p p 1 因為質數p除了1以外的因數只有p,故1至p的整數只有p與p不互質 2.如果i mod p 0,那麼phi i p p phi i 若整數...

篩法求尤拉函式

題目鏈結 題意 給定乙個正整數n,求1 n中每個數的尤拉函式之和。輸入格式 共一行,包含乙個整數n。輸出格式 共一行,包含乙個整數,表示1 n中每個數的尤拉函式之和。資料範圍 1 n 1e6 輸入樣例 6輸出樣例 12思路 如果直接用尤拉函式每次求一遍質因數的話就是o n sqrt n 的時間複雜度...