学习C++从娃娃抓起!记录下洛谷C++学习和备考过程中的题目,记录每一个瞬间。
附上汇总贴:洛谷刷题C++语言 | 汇总
【题目描述】
Caima 给你了所有 [a,b] 范围内的整数。一开始每个整数都属于各自的集合。每次你需要选择两个属于不同集合的整数,如果这两个整数拥有大于等于 p 的公共质因数,那么把它们所在的集合合并。
重复如上操作,直到没有可以合并的集合为止。
现在 Caima 想知道,最后有多少个集合。
【输入】
一行,共三个整数 a,b,p,用空格隔开。
【输出】
一个数,表示最终集合的个数。
【输入样例】
10 20 3
【输出样例】
7
【代码详解】
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int p[N],isprime[N];
int a, b, k, ans;
int find(int x)
{
return p[x]==x ? x : p[x]=find(p[x]);
}
int main()
{
cin >> a >> b >> k; //k为公共质因数
for (int i=1; i<=b; i++) p[i] = i;
for (int i=2; i<=b; i++) {
if (isprime[i]==0) {
for (int j=i+i; j<=b; j+=i) {
isprime[j]=1;
if (i>=k) {
int x = find(j);
p[x] = i;
}
}
}
}
set<int> se;
for (int i=a; i<=b; i++) {
se.insert(find(i));
}
cout << se.size();
return 0;
}
【运行结果】
10 20 3
7