CJOJ 1504 整數合併

2021-07-30 03:18:45 字數 1032 閱讀 4197

現在給你一些連續的整數,它們是從 a 到 b 的整數。一開始每個整數都屬於各自的集合,然後你需要進行如下操作:

每次選擇兩個屬於不同集合的整數,如果這兩個整數擁有大於等於 p 的公共質因子,那麼把他們所在的集合合併。

反覆上述操作,直到沒有可以合併的集合為止。

現在,小 x 想知道,最後有多少個集合。

一行,三個整數 a,b,p

乙個數,表示最終集合的個數。

10 20 3

7

樣例解釋:

解釋: , , , , , ,

【資料規模】

b<=1000. 80%資料

a<=b<=100000; 2<=p<=b

並查集 ,數學 ,數論

對於有相同質因數的數字加入乙個集合,最後統計集合的個數即可(爸爸是自己的點的個數)

#include #include #include #include #include #include #include #include #include #include #define l 100010

#define ll long long

using namespace std;

int a, b, p, prim[l], cnt, f[l], ans;

bool check[l];

inline int find(int x)

inline void makeset(int x, int fa)

int main()

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

if (prim[i] >= p)

for (int i = a; i <= b; ++i) if (f[i] == i) ans++;

printf("%d\n", ans);

return 0;

}

注意合併集合的時候試講他們的父親放在一起,以及初始化的時候初始自己的父親是自己

CJOJ 免費航班

小z在moi比賽中獲得了大獎,獎品是一張特殊的機 票。使用這張機票,可以在任意乙個國家內的任意城市之間的免費飛行,只有跨國飛行時才會有額外的費用。小z獲得了一張地圖,地圖上有城市之間的飛機航班和 費用。已知從每個城市出發能到達所有城市,兩個城市之間可能有不止乙個航班。乙個國家內的每兩個城市之間一定有...

CJOJ 為了博多

做了個噩夢,夢見我的 n 把刀到60級會二次變身,變成乙個對推6圖有xi點貢獻,刷大阪城有yi點貢獻的刀,於是要把刀分成兩隊一隊刷大阪城另一隊推6圖 但是有m對兄弟刀在同一隊會有特殊的buff加成,加成值為wi,問怎樣分隊收益最大,最大值是多少。第一行兩個整數n 刀的數目 0 n 20000 m 兄...

CJOJ 2398 簡單的數列

簡單的數列 乙個簡單的數列問題 給定乙個長度為n的數列,求這樣的三個元素 ai,aj,ak 的個數,滿足 ai aj ak,且 i j k 第1行是乙個整數n 1 n 50000 接下來n行,每行乙個元素ai 0 ai 32767 乙個數,滿足 ai aj ak i j k 的個數。5 1 2 3 ...