P1621 集合 尤拉篩 並查集

2021-09-10 13:23:01 字數 898 閱讀 2966

題目鏈結

這個題要求我們在乙個區間[a,b]中找出幾個集合,集合中的數滿足是乙個大於等於p的質因數的個數。

看到集合這個定義,我們瞬間會想到用並查集來維護這個集合,那麼對於這個集合,他滿足乙個性質,

就是如果我們,起始的時候初始化每乙個數的父親都是自己,那麼每乙個集合中有且只有乙個數的父親

是自己。根據這個性質,我們明確了求解答案的條件,就是將所有有大於等於p的質因數的一堆數合併起來,

統計父親是自己的個數。

那麼我們如何將有同樣大於等於p的質因數找出來呢,我們選擇通過中轉的方式來進行,即如果我們找到

1個大於等於p的質因數是這個數的因數,那麼我們把這兩個數放在乙個集合中,最終與這個數有同樣質因數

的數也會在這個集合中。

那麼我們應該如何找這些質因數呢,我們自然而然的想到通過篩法進行預處理,這次我們採用的事尤拉篩法

,時間複雜度為o(n)。

關於尤拉篩

for(int i=2;i<=b;i++)

}

把這個**貼出來:

// luogu-judger-enable-o2

//洛谷 並查集

//集合

#include #define n 200010

using namespace std;

int ans;

int a,b,p,cnt,p[n],vis[n];

int fa[n];

int find(int x)

void merge(int x,int y)

int main()

} for(int i=1;i<=cnt;i++)

if(p[i]>=p)

for(int i=a;i<=b;i++)

cout《完結撒花。

P1621 集合 並查集 素數

p1621 集合 並查集 素數 傳送門題目描述 caima 給你了所有 a,b 範圍內的整數。一開始每個整數都屬於各自的集合。每次你需要選擇兩個屬於不同集合的整數,如果這兩個整數擁有大於等於 p 的公共質因數,那麼把它們所在的集合合併。重複如上操作,直到沒有可以合併的集合為止。現在 caima 想知...

hdoj1878《 並查集 尤拉》

c 並查集 尤拉 time limit 1000ms memory limit 32768kb 64bit io format i64d i64u submit status description 尤拉迴路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定乙個圖,問是否存...

NC15167 集合問題(並查集)

這道題目思維量還是挺大的,因為這道題也是維護集合關係,所以我們想到用並查集去維護。我們應該想到的是,用map對映一下位置,因為原來的資料比較大,不宜維護並查集關係,並且設計兩個原點 0 和n 1,表示ab集合,這招是常見手段,因為這兩個點是特殊的。之前有到異或並查集也是設計乙個另外的原點 又因為x和...