現在給你一些連續的整數,它們是從 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 ...