線性篩理解及應用

2022-09-10 04:24:11 字數 1874 閱讀 5992

目錄

如何求出1~n的素數個數呢

我們只要將素數的倍數全部篩掉就可以

**

埃氏篩

int isprime(int n)

return cnt;

}

埃氏篩法會將合數重複地篩掉,如有可以只篩一次合數,那麼複雜度就會降到o(n)

線性篩(尤拉篩)就是通過合數最小的質因子篩掉這個合數

int isprime(int n)

}return cnt;

}

求1~n的尤拉函式的和

乙個數n,那麼1~n中和n互質的數的個數,就是n的尤拉函式

尤拉函式有以下性質:

暴力寫法直接求每個數的尤拉函式,再sum求和,複雜度接近n*n了

# include using namespace std;

typedef long long ll;

ll oula(int n)

}if (n > 1) res = res/n*(n-1);

return res;

}int main()

下面是線性篩法,先看**,再解釋

# include using namespace std;

typedef long long ll;

const int n = 1e6 + 10;

bool st[n]; // 這裡記錄狀態

ll prime[n]; // 存質數

ll phi[n]; // 尤拉函式

ll euler(ll n)

for (int j = 0; prime[j] <= n/i; j ++)

phi[i * prime[j]] = (prime[j] - 1) * phi[i];}}

ll sum = 0;

for (int i = 1; i <= n; i ++)

sum += phi[i];

return sum;

}int main()

6 可以是 23 ,那麼 尤拉函式就是6(1-1/2)*(1-1/3),這裡n是6, 而對於求2的100次方乘上 3的一百次方這樣的數的樓拉函式,底數是不會改變的,我們 只需要更新n就可以

求phi[primes[j]i],分析phi[primes[j]i]和phi[i]的關係

如果i%primes[j]==0時,說明primes[j]為i的最小質因子,而phi[i]內已經乘過(primes[j]-1)/primes[j]

∴計算phi[primes[j]i]只需要更新n的值即可,即在phi[i]的基礎上乘個primes[j]

∴phi[primes[j]i]=primes[j]phi[i];

如果i%primes[j]!=0時,primes[j]小於i的最小質因子,而phi[i]內沒有乘過(primes[j]-1)/primes[j]

∴計算phi[primes[j]i]除了需要更新n值外,還需要乘上(primes[j]-1)/primes[j]

∴phi[primes[j]i]=primes[j]phi[i](primes[j]-1)/primes[j]=phi[i](primes[j]-1)

再看看大佬的**促進理解:

素數 篩 理解

埃拉託斯特尼篩法的時間複雜度是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 pri...

單調棧理解及應用

單調棧 棧內元素,按照 單調遞增或單調遞減 排序,如果新入棧元素破壞了單調性,就彈出棧內元素,直到滿足單調性。作用 o n 時間複雜度分別求左右兩邊第乙個比它大或比它小的元素。單調遞增棧為例 維護 每次入棧前先檢驗棧頂元素和進棧元素的大小,判斷棧內元素是否出棧 棧內元素大於等於入棧元素則棧內元素出棧...

session的理解及應用

in computer science,in particlular networking,a session是一種在多個裝置 計算機或者使用者 login session 之間進行的半永久性 其資訊傳輸通道是活動的 的互動式 動作 的資訊交換過程,即連線建立到連線斷開的這一時間段中一系列的資訊交換...